質問するログイン新規登録

質問編集履歴

2

一応動作した版を追記

2018/11/28 04:05

投稿

elpha
elpha

スコア18

title CHANGED
File without changes
body CHANGED
@@ -73,6 +73,7 @@
73
73
  やはり非同期通信が原因とのことでしたので、初めてながらasync/awaitというやつで書き換えてみましたが
74
74
  何かが足りないのか、やはり検索結果は変わりません…
75
75
  ```Node.js
76
+ (略)
76
77
  async function main() {
77
78
  console.log('ループ開始');
78
79
  for(let i=0; i<3; i++){
@@ -98,4 +99,49 @@
98
99
  }
99
100
 
100
101
  main();
101
- ```
102
+ ```
103
+ ### 動作した版
104
+ いただいた回答を元にさらに修正したところ、無事動作しました
105
+ ```Node.js
106
+ const Twit = require('twit');
107
+
108
+ const T = new Twit({
109
+ consumer_key: "略",
110
+ consumer_secret: "略",
111
+ access_token_key: "略",
112
+ access_token_secret: "略",
113
+ app_only_auth: true
114
+ });
115
+
116
+ let num = 0;
117
+ let lastId = '';
118
+
119
+ let params = {
120
+ q: '#ハッシュタグ since:2018-11-28_00:00:00_JST until:2018-11-28_00:30:00_JST',
121
+ count: 3,
122
+ max_id: lastId,
123
+ result_type: 'recent',
124
+ include_entities: false
125
+ }
126
+
127
+ !(async () => {
128
+ for(let i=1; i<=3; i++){
129
+ console.log('\n\n' + i + '回目の検索開始 ID' + lastId + '以前のツイートを検索');
130
+ params.max_id = lastId;
131
+ const result = await T.get('search/tweets', params);
132
+ result.data.statuses.forEach(function(val, index, ar){
133
+ num++;
134
+ console.log(`\n${parseInt(index) + 1}個目のツイート (累計${num}個目)`);
135
+ console.log('@' + val.user.screen_name);
136
+ console.log(val.text.replace(/\r?\n/g, ''));
137
+ lastId = val.id_str;
138
+ console.log('ツイートのIDは' + lastId);
139
+ })
140
+ console.log('\n最後のツイートのIDは' + lastId);
141
+ }
142
+ })();
143
+ ```
144
+ このままだと再検索のたびに最初と最後のツイート内容が重複してしまうので、ほんとは再検索の際にIDを-1したいところですが
145
+ なまじIDの桁数が多いため計算に誤差が生じて面倒なので、ひとまず重複をよしとしています
146
+ > なぜJavaScriptで「76287755398823936」が正しく表示できないか、あるいはなぜRubyでも表せないか。
147
+ > https://7io.org/2011/07/02/21:11:55/

1

async/awaitで書き換え

2018/11/28 04:05

投稿

elpha
elpha

スコア18

title CHANGED
File without changes
body CHANGED
@@ -67,4 +67,35 @@
67
67
  それともJavaScriptの何か初歩的な間違い(スコープなど)を犯しているのでしょうか?
68
68
 
69
69
  ここさえ解決できれば、800ツイートでも2000ツイートでも(規制のかからないかぎり)検索できるとは思うのですが…
70
- ご教授よろしくお願いいたします。
70
+ ご教授よろしくお願いいたします。
71
+
72
+ ### 追記
73
+ やはり非同期通信が原因とのことでしたので、初めてながらasync/awaitというやつで書き換えてみましたが
74
+ 何かが足りないのか、やはり検索結果は変わりません…
75
+ ```Node.js
76
+ async function main() {
77
+ console.log('ループ開始');
78
+ for(let i=0; i<3; i++){
79
+ await search();
80
+ }
81
+ }
82
+
83
+ function search() {
84
+ return new Promise((resolve, reject) => {
85
+ console.log('検索開始');
86
+ params.max_id = lastId;
87
+ T.get('search/tweets', params, (err, data, response) => {
88
+ data.statuses.forEach(function(val, index, ar){
89
+ console.log(index);
90
+ console.log('@' + val.user.screen_name);
91
+ console.log(val.text);
92
+ lastId = val.id.str;
93
+ });
94
+ });
95
+ console.log('最後のIDは' + lastId);
96
+ resolve();
97
+ });
98
+ }
99
+
100
+ main();
101
+ ```