Pee*_*eja 169 instagram instagram-api
我试图将用户最近的Instagram媒体放在侧边栏上.我正在尝试使用Instagram API来获取媒体.
http://instagram.com/developer/endpoints/users/
文档说到GET https://api.instagram.com/v1/users/<user-id>/media/recent/,但它说要传递OAuth访问令牌.访问令牌代表代表用户行事的授权.我不希望用户登录Instagram以在侧栏上看到这一点.他们甚至不需要拥有Instagram帐户.
例如,我可以在没有登录Instagram并查看照片的情况下访问http://instagram.com/thebrainscoop.我想通过API来做到这一点.
在Instagram API中,非用户身份验证的请求通过client_id而不是access_token.但是,如果我尝试这样做,我得到:
{
"meta":{
"error_type":"OAuthParameterException",
"code":400,
"error_message":"\"access_token\" URL parameter missing. This OAuth request requires an \"access_token\" URL parameter."
}
}
Run Code Online (Sandbox Code Playgroud)
那么,这不可能吗?没有要求用户首先通过OAuth登录Instagram帐户,是否无法获取用户的最新(公共)媒体?
350*_*50D 323
var name = "smena8m";
$.get("https://images"+~~(Math.random()*33)+"-focus-opensocial.googleusercontent.com/gadgets/proxy?container=none&url=https://www.instagram.com/" + name + "/", function(html) {
if (html) {
var regex = /_sharedData = ({.*);<\/script>/m,
json = JSON.parse(regex.exec(html)[1]),
edges = json.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges;
$.each(edges, function(n, edge) {
var node = edge.node;
$('body').append(
$('<a/>', {
href: 'https://instagr.am/p/'+node.shortcode,
target: '_blank'
}).css({
backgroundImage: 'url(' + node.thumbnail_src + ')'
}));
});
}
});Run Code Online (Sandbox Code Playgroud)
html, body {
font-size: 0;
line-height: 0;
}
a {
display: inline-block;
width: 25%;
height: 0;
padding-bottom: 25%;
background: #eee 50% 50% no-repeat;
background-size: cover;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>Run Code Online (Sandbox Code Playgroud)
您可以使用下载JSON格式的任何用户的Instagram照片进?__a=1旁边的着陆页网址这样.无需获取用户ID或注册应用程序,无需令牌,无需oAuth.
min_id和max_id变量可用于分页,这是一个例子
YQL可能无法在剪切的iframe内部工作,因此您始终可以在YQL控制台中手动检查它
2018年4月更新:在最新的Instagram更新后,您无法在客户端(javascript)执行此操作,因为由于CORS Access-Control-Allow-Headers限制,无法使用javascript设置签名请求的自定义标头.它仍然可以通过做这个php或任何其他服务器端方法与基于适当的签名rhx_gis,csrf_token和请求参数.你可以在这里阅读更多相关信息.
2019年1月更新:YQL已退役,因此,请使用Google Image Proxy检查我的最新更新作为CORSInstagram页面的代理!然后只有负面时刻 - 这种方法无法获得分页.
PHP 解:
$html = file_get_contents('https://instagram.com/apple/');
preg_match('/_sharedData = ({.*);<\/script>/', $html, $matches);
$profile_data = json_decode($matches[1])->entry_data->ProfilePage[0]->graphql->user;
Run Code Online (Sandbox Code Playgroud)
Ers*_*ano 122
这已经很晚了,但是如果有人帮助我,就像我在Instagram的文档中没有看到它一样.
要执行GET https://api.instagram.com/v1/users/<user-id>/media/recent/(在写入的当前时间),您实际上不需要OAuth访问令牌.
你可以表演 https://api.instagram.com/v1/users/[USER ID]/media/recent/?client_id=[CLIENT ID]
[CLIENT ID]将是通过管理客户端在应用程序中注册的有效客户端ID(与用户无关).您可以通过执行GET用户搜索请求从用户名获取[USER ID]:
https://api.instagram.com/v1/users/search?q=[USERNAME]&client_id=[CLIENT ID]
Foo*_*iko 37
11.11.2017
由于Instagram改变了他们提供这些数据的方式,现在上述方法都没有奏效.以下是获取用户媒体的新方法:
GET https://instagram.com/graphql/query/?query_id=17888483320059182&variables={"id":"1951415043","first":20,"after":null}
其中:
query_id- 永久值:17888483320059182(注意将来可能会更改).
id - 用户的ID.它可能带有用户列表.要获取用户列表,您可以使用以下请求:GET https://www.instagram.com/web/search/topsearch/?context=blended&query=YOUR_QUERY
first- 要获取的项目数量.
after - 如果您想从该ID获取项目,则为最后一项的ID.
Mic*_*ael 30
我能够在没有身份验证的情况下使用以下API获取用户的最新媒体(包括描述,喜欢,评论计数).
https://www.instagram.com/apple/?__a=1
例如
https://www.instagram.com/{username}/?__a=1
Run Code Online (Sandbox Code Playgroud)
whi*_*kid 16
截至上周,Instagram禁用了/media/网址,我实施了一个解决方法,现在效果很好.
为了解决这个问题中每个人的问题,我写了这个:https://github.com/whizzzkid/instagram-reverse-proxy
它使用以下端点提供所有instagram的公共数据:
获取用户媒体:
https://igapi.ga/<username>/media
e.g.: https://igapi.ga/whizzzkid/media
Run Code Online (Sandbox Code Playgroud)
获取具有限制计数的用户媒体:
https://igapi.ga/<username>/media?count=N // 1 < N < 20
e.g.: https://igapi.ga/whizzzkid/media?count=5
Run Code Online (Sandbox Code Playgroud)
使用JSONP:
https://igapi.ga/<username>/media?callback=foo
e.g.: https://igapi.ga/whizzzkid/media?callback=bar
Run Code Online (Sandbox Code Playgroud)
代理API还会将下一页和上一页网址附加到响应中,因此您无需在最后计算.
希望你们喜欢!
感谢@ 350D发现这个:)
小智 14
Instagram API要求通过OAuth进行用户身份验证,以便为用户访问最近的媒体端点.现在似乎没有任何其他方式来为用户获取所有媒体.
小智 9
如果您正在寻找一种生成访问令牌以在单个帐户上使用的方法,您可以尝试这一点 - > https://coderwall.com/p/cfgneq.
我需要一种方法来使用instagram api来获取特定帐户的所有最新媒体.
这是一个rails解决方案.它是一种后门,实际上是前门.
# create a headless browser
b = Watir::Browser.new :phantomjs
uri = 'https://www.instagram.com/explore/tags/' + query
uri = 'https://www.instagram.com/' + query if type == 'user'
b.goto uri
# all data are stored on this page-level object.
o = b.execute_script( 'return window._sharedData;')
b.close
Run Code Online (Sandbox Code Playgroud)
您获得的对象取决于它是用户搜索还是标签搜索.我得到这样的数据:
if type == 'user'
data = o[ 'entry_data' ][ 'ProfilePage' ][ 0 ][ 'user' ][ 'media' ][ 'nodes' ]
page_info = o[ 'entry_data' ][ 'ProfilePage' ][ 0 ][ 'user' ][ 'media' ][ 'page_info' ]
max_id = page_info[ 'end_cursor' ]
has_next_page = page_info[ 'has_next_page' ]
else
data = o[ 'entry_data' ][ 'TagPage' ][ 0 ][ 'tag' ][ 'media' ][ 'nodes' ]
page_info = o[ 'entry_data' ][ 'TagPage' ][ 0 ][ 'tag' ][ 'media' ][ 'page_info' ]
max_id = page_info[ 'end_cursor' ]
has_next_page = page_info[ 'has_next_page' ]
end
Run Code Online (Sandbox Code Playgroud)
然后,我通过以下方式构建URL来获取另一页结果:
uri = 'https://www.instagram.com/explore/tags/' + query_string.to_s\
+ '?&max_id=' + max_id.to_s
uri = 'https://www.instagram.com/' + query_string.to_s + '?&max_id='\
+ max_id.to_s if type === 'user'
Run Code Online (Sandbox Code Playgroud)
感谢Instagram不断变化(以及可怕的设计)API架构,上述大部分内容将不再适用于2018年4月.
如果您使用该https://www.instagram.com/username/?__a=1方法直接查询其API,则这是访问单个帖子数据的最新路径.
假设您返回的JSON数据是,$data您可以使用以下路径示例循环遍历每个结果:
foreach ($data->graphql->user->edge_owner_to_timeline_media->edges as $item) {
$content_id = $item->node->id;
$date_posted = $item-node->taken_at_timestamp;
$comments = $item->node->edge_media_to_comment->count;
$likes = $item->node->edge_liked_by->count;
$image = $item->node->display_url;
$content = $item->node->edge_media_to_caption->edges[0]->node->text;
// etc etc ....
}
Run Code Online (Sandbox Code Playgroud)
最近这一变化的主要内容是graphql和edge_owner_to_timeline_media.
看起来他们将在DEC 2018中为非"业务"客户终止这种API访问,因此尽可能充分利用它.
希望它可以帮助某人;)
小智 6
如果您想在没有 clientID 和访问令牌的情况下搜索用户:
1:如果你想搜索所有与你的名字与你的搜索词相似的用户:
将 SeachName 替换为您要搜索的文本:
https://www.instagram.com/web/search/topsearch/?query=SearchName
2:如果你想搜索完全相同的名称用户:
将 UserName 替换为您想要的搜索名称:
只想添加到@ 350D答案,因为我很难理解.
我的代码逻辑是下一个:
第一次调用API时,我只是在调用https://www.instagram.com/_vull_
/media/.当我收到回复时,我检查了布尔值more_available.如果是真的,我从数组中获取最后一张照片,获取其ID,然后再次调用Instagram API,但这一次 https://www.instagram.com/_vull_/media/?max_id=1400286183132701451_1642962433.
重要的是要知道这个,这个Id是数组中最后一张图片的Id.因此,当要求maxId使用数组中图片的最后一个id时,您将获得接下来的20张图片,依此类推.
希望这能澄清事情.
还有一个技巧,通过标签搜索照片:
GET https://www.instagram.com/graphql/query/?query_hash=3e7706b09c6184d5eafd8b032dbcf487&variables={"tag_name":"nature","first":25,"after":""}
Run Code Online (Sandbox Code Playgroud)
在哪里:
query_hash - 永久值(我相信它的哈希值为 17888483320059182,将来可以更改)
tag_name - 标题不言自明
first - 要获取的项目数量(不知道为什么,但这个值没有按预期工作。实际返回的照片数量略大于乘以4.5的值(值25约为110,值25约为460)值 100))
after- 如果您想从该 id 中获取项目,则为最后一个项目的 id。end_cursor可以在此处使用来自 JSON 响应的值。
Javascript:
$(document).ready(function(){
var username = "leomessi";
var max_num_items = 5;
var jqxhr = $.ajax( "https://www.instagram.com/"+username+"/?__a=1" ).done(function() {
//alert( "success" );
}).fail(function() {
//alert( "error" );
}).always(function(data) {
//alert( "complete" )
items = data.graphql.user.edge_owner_to_timeline_media.edges;
$.each(items, function(n, item) {
if( (n+1) <= max_num_items )
{
var data_li = "<li><a target='_blank' href='https://www.instagram.com/p/"+item.node.shortcode+"'><img src='" + item.node.thumbnail_src + "'/></a></li>";
$("ul.instagram").append(data_li);
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
HTML:
<ul class="instagram">
</ul>
Run Code Online (Sandbox Code Playgroud)
CSS:
ul.instagram {
list-style: none;
}
ul.instagram li {
float: left;
}
ul.instagram li img {
height: 100px;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159745 次 |
| 最近记录: |