//tips
//smart contract
Twitter-liteを活用したtimeline機能を実装していく。
Twitterフォルダの中にstream.jsファイルを作成。
https://stackoverflow.com/questions/60476567/how-to-get-twitter-homepage-stream-with-twitter-lite
https://twittercommunity.com/t/is-there-way-to-stream-realtime-tweets-from-a-single-user/141504/3
まずはstreamの型を準拠する形から始める。
const results = await client.get('stream/home_timeline');
console.log(`Rate: ${tweets._headers.get('x-rate-limit-remaining')} / ${tweets._headers.get('x-rate-limit-limit')}`);
const delta = (tweets._headers.get('x-rate-limit-reset') * 1000) - Date.now()
console.log(`Reset: ${Math.ceil(delta / 1000 / 60)} minutes`);
追加したらindex.jsの方も加工。
async function handleOnStreamSubmit(e) {
e.preventDefault();
const results = await fetch('/api/twitter/stream').then(res => res.json());
setStatuses(results.data);
}
Rerutn以下は変えずに様子を見る。
フォームは下記のようにした。
<form onSubmit={handleOnStreamSubmit}>
<h2>Timeline</h2>
<button>Timeline</button>
</form>
x-rate-limit-limitはレート制限と呼ばれるものの一種のよう。
https://qiita.com/yuji_saito/items/2834ab921d9d4f0639a8
ここで確認を入れる。
表示されたタイムラインボタンをクリックしても何も表示されないので、console.log(results);をイベント関数に組み込みデータが取得できているかチェック。/home_timelineは古すぎる可能性がある。
async function handleOnStreamSubmit(e) {
e.preventDefault();
const results = await fetch('/api/twitter/stream').then(res => res.json());
console.log(results);
console.log('hi');
setStatuses(results.data);
}
エラー内容としては、
GET http://localhost:3000/api/twitter/stream 400 (Bad Request)
'invalid json response body at https://api.twitter.…imeline.json reason: Unexpected end of JSON input'}
となっている。データが大きすぎるので分割して受け取れるようにしなければならないのか。
response.on('data', (data) => {
chunks.push(data);
});
response.on('end', () => {
参考:
https://kuttsun.blogspot.com/2021/11/nodejs-unexpected-end-of-json-input.html
https://stackoverflow.com/questions/65140822/node-fetch-help-getting-fetcherror-invalid-json-response-body-at-url-reas
https://github.com/twitterdev/Twitter-API-v2-sample-code/blob/main/Filtered-Stream/filtered_stream.js
最後のはneedle使っているデモのコード。
容量が大きくなると下記のような流れを踏襲する必要がありそう。
const parameters = {
track: "#bitcoin,#litecoin,#monero",
follow: "422297024,873788249839370240", // @OrchardAI, @tylerbuchea
locations: "-122.75,36.8,-121.75,37.8", // Bounding box - San Francisco
};
const stream = client.stream("statuses/filter", parameters)
.on("start", response => console.log("start"))
.on("data", tweet => console.log("data", tweet.text))
.on("ping", () => console.log("ping"))
.on("error", error => console.log("error", error))
.on("end", response => console.log("end"));
// To stop the stream:
process.nextTick(() => stream.destroy()); // emits "end" and "error" events
そうなると、parametersに入れる値、特に取得ツイート数の制限と取得先のidなどが必要となるのだが、 client = new Twitterから取得できなのだろうか。
まずは
async function tweetThread(thread) {
let lastTweetID = "";
for (const status of thread) {
const tweet = await client.post("statuses/update", {
status: status,
in_reply_to_status_id: lastTweetID,
auto_populate_reply_metadata: true
});
lastTweetID = tweet.id_str;
}
}
const thread = ["First tweet", "Second tweet", "Third tweet"];
tweetThread(thread).catch(console.error);
を試してみるか。
ツイートidはツイートurlからわかるようなので該当箇所を抽出。
まずは一つのツイートを取り出してみるところから始める。
const rateLimits = await client.get("statuses/show", {
id: "1496488763308281859"
});
http://localhost:3000/api/twitter/stream 400 (Bad Request)となってしまっている。
const params = {
//q: "#bitcoin",
count:10
};
const results = await client.get('search/tweets',params);
console.log(results);
このような形に変更。
https://github.com/draftbit/twitter-lite
export default async (req, res) => {//APIのルートの一つ/search
const body = JSON.parse(req.body);
console.log(body);
const { query } = body;
Searchと基本的な構造を同じにしてやってもなぜかデータを取得できない。getのどこかで間違っているのか。
イベント関数の方がまずいのか、そもそもsearch/tweetsはポストを使わないと実行できないのか。
単純なfetchは下記のようにできる。
fetch('http://example.com/movies.json')
.then(response => response.json())
.then(data => console.log(data));
認証情報つきのリクエストに該当し、
fetch('https://example.com', {
credentials: 'include'
});
もつける必要があったのか確認。効果なし。
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch
どうするか。
search/tweetsの例ばかり出てくるがgetでも利用できないことはなさそう。statuses/user_timelineでも試す。
https://stackoverflow.com/questions/60476567/how-to-get-twitter-homepage-stream-with-twitter-lite
https://qiita.com/n0bisuke/items/77a4eeaa6d4c3a9fabc0
https://teratail.com/questions/340382