Blockchain code Metaverse VR

Crypto×VR×SmartContract(486)

スポンサーリンク

//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

人気の記事

1

コロナによる需要変化 コロナパンデミックの影響で、人々は外に出られなくなり、自宅で過ごす時間が増えました。 この自粛ムードの中、下記のようなビジネスの需要変化が引き起こされています。 【利用者減少】 ...

2

米国レストランの決済時に毎日お世話になっていた「Square」のビジネスモデルについて本日はふれていきたいと思います。 「Square」とは、ネットにつながったモバイル端末と専用のカードリーダーを用意 ...

3

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

4

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

5

ナイキのSNKRSが、なぜこれほどまでに人気なのか?調べてみました。 きっかけは米国での友達との会話。彼は自分のシューズをみせて、「これ20万円もしたんだぜ。」と語ってくれました。 あまり靴に興味がな ...

-Blockchain, code, Metaverse, VR
-, ,

Copyright© BUSINESS HACKER , 2022 All Rights Reserved Powered by AFFINGER5.