Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按标签和时间范围查询Instagram帖子_Javascript_Node.js_Api_Instagram_Instagram Api - Fatal编程技术网

Javascript 按标签和时间范围查询Instagram帖子

Javascript 按标签和时间范围查询Instagram帖子,javascript,node.js,api,instagram,instagram-api,Javascript,Node.js,Api,Instagram,Instagram Api,我试图通过提供标签和时间范围(自日期和截止日期)从Instagram查询帖子。 我用这个 https://api.instagram.com/v1/tags/{tag name}/media/recent?access_token=access-token 我的代码是使用库在Node.js中编写的(请参阅内联注释): //需要配置文件 var config=require('../config.js'); //要求并初始化instagram实例 var ig=require('instagram

我试图通过提供标签和时间范围(自日期和截止日期)从Instagram查询帖子。 我用这个

https://api.instagram.com/v1/tags/{tag name}/media/recent?access_token=access-token

我的代码是使用库在Node.js中编写的(请参阅内联注释):

//需要配置文件
var config=require('../config.js');
//要求并初始化instagram实例
var ig=require('instagram-node')。instagram();
//设置访问令牌
ig.use({access_token:config.instagram.access_token});
//我们导出此函数以供公共使用
//hashtag:要搜索的hashtag
//minDate:自日期起
//maxDate:截止日期
//回调:回调函数(err,posts)
module.exports=函数(hashtag、minDate、maxDate、回调){
//创建posts数组(将与分页响应中的新posts关联)
var posts=[];
//将日期对象转换为时间戳(秒)
var sinceTime=Math.floor(minDate.getTime()/1000);
var untilTime=Math.floor(maxDate.getTime()/1000);
//逐页获取IG帖子
ig.tag_media_recent(hashtag,{count:50},函数fetchPosts(err,media,分页,剩余,限制){
//处理错误
如果(错误){
返回回调(err);
}
//按时间手动筛选
var filteredByTime=medias.filter(函数(currentPost){
//将创建的时间字符串转换为数字(秒时间戳)
var createdTime=+currentPost.created\u时间;
//检查是否在自日期之后和截止日期之前

return createdTime>=sinceTime&&createdTime我认为这是您正在寻找的基本想法。我对Node.js不太熟悉,所以这都是纯javascript。您必须修改它以满足您的需要,并可能利用它生成一个函数

想法是转换instagram id(本例中为1116307519311125603)日期,反之亦然,使您能够快速获取特定的时间点,而不是回溯所有结果,直到找到所需的时间戳。下划线“\u1”后面的id部分应该被删除,因为它以某种方式指向用户IIRC。我希望示例中有4个函数可以帮助您

快乐的黑客

//static
var epoch_hour = 3600,
    epoch_day = 86400,
    epoch_month = 2592000,
    epoch_year = 31557600;

//you'll need to set this part up/integrate it with your code
var dataId = 1116307519311125603,
    range = 2 * epoch_hour,
    count = 1,
    tagName = 'cars',
    access = prompt('Enter access token:'),
    baseUrl = 'https://api.instagram.com/v1/tags/' + 
              tagName + '/media/recent?access_token=' + access;

//date && id utilities
function idToEpoch(n){
  return Math.round((n / 1000000000000 + 11024476.5839159095) / 0.008388608);
}

function epochToId(n){
  return Math.round((n * 0.008388608 - 11024476.5839159095) * 1000000000000);
}

function newDateFromEpoch(n){
  var d = new Date(0);
  d.setUTCSeconds(n);
  return d;
}

function dateToEpoch(d){
  return (d.getTime()-d.getMilliseconds())/1000;
}

//start with your id and range; do the figuring
var epoch_time = idToEpoch(dataId),
    minumumId = epochToId(epoch_time),
    maximumId = epochToId(epoch_time + range),
    minDate = newDateFromEpoch(epoch_time),
    maxDate = newDateFromEpoch(epoch_time + range);

var newUrl = baseUrl + 
             '&count=' + count + 
             '&min_tag_id=' + minumumId + 
             '&max_tag_id=' + maximumId;


//used for testing
/*alert('Start: ' + minDate + ' (' + epoch_time + 
        ')\nEnd: ' + maxDate + ' (' + (epoch_time +
        range) + ')');
window.location = newUrl;*/
为了支持出色的回答,通过plpgSQL函数生成instagram ID:

CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$
DECLARE
    our_epoch bigint := 1314220021721;
    seq_id bigint;
    now_millis bigint;
    shard_id int := 5;
BEGIN
    SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;

    SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
    result := (now_millis - our_epoch) << 23;
    result := result | (shard_id << 10);
    result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;
创建或替换函数insta5.next_id(OUT result bigint)作为$$
声明
我们的_epoch bigint:=1314220021721;
seq_id bigint;
现在_millisbigint;
shard_id int:=5;
开始
选择nextval('insta5.table_id_seq')%%1024进入seq_id;
选择地板(从时钟时间戳()提取历元*1000)到现在的毫秒;

结果:=(现在是我们的纪元)你能不能增加
计数来一次抓取更多的照片来减少后期抓取的数量?当然,它们会更大,但这样做会有好处吗?@NickZ我们确实尝试过这样做(我正在调试这是OP)我们得到的最大数量是33项/请求。因此,
count
没有真正的帮助…:-(还有其他想法吗?我很高兴给一个回答好的人50分。:d你有没有研究过使用MIN_TAG_ID和MAX_TAG_ID快速迭代到目标日期?我可以想象一种方法,一次只查询一篇帖子,找到刚好在所需日期之前的MAX_TAG_ID。看到没有任何参数引用时,您需要根据响应执行此筛选。抓取数据并删除不需要的内容是否不可接受?@sbozzie是的,这可能是
分页所做的。下一步
在内部执行。但这与日期无关(或者是吗?)。如果您发现日期与标记id之间存在关系,那就太好了(例如,
2013年3月21日
转换成标签id,使用标签id将获取从该日期开始的帖子)。我猜标签id只是一个内部id,但我不确定。这看起来很棒!我正在测试它–你能解释这些神奇的数字:
返回数学圆((n*0.008388608-11024476.5839159095)*10000000000);
?参考Instagram编码ID的地方会很有用。这闻起来像是未记录的功能。老实说,我今天创建Instagram帐户只是为了使用他们的API控制台。确定(实际上是近似的)编码只是进行了一点反向工程。在我找到的任何地方都没有文档记录。:(找到文档!公平地说,这是一篇博客文章,但仍然是“官方”的。很遗憾,这正式不再有效。Instagram开始散列其最大标记id,并停止支持最小标记id
CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$
DECLARE
    our_epoch bigint := 1314220021721;
    seq_id bigint;
    now_millis bigint;
    shard_id int := 5;
BEGIN
    SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;

    SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
    result := (now_millis - our_epoch) << 23;
    result := result | (shard_id << 10);
    result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;