HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0623
SMOPUTsubuyakiSoupでリアルタイムDM送信をやりたい8未解決


SMOPU

リンク

2022/6/23(Thu) 00:24:15|NO.96706

TsubuyakiSoupのTwitter APIでリアルタイムDM返信をやろうと考えていますが、どうもうまくいきません…。

なにがいけないのでしょうか?
APIからのDM送信はAPI制限に引っ掛かりそうなので、DMが来たらdialogを表示させるようにしていますが、どうもうまくいかないようなので、わかる人がいましたら、ご教授お願いします。


dim jsonPtrRoot sdim sender_id sdim recipient_id repeat GetDirectMessage 5 response = getResponseBody() jsonopen jsonPtrRoot, response if (jsonPtrRoot == 0) : dialog "jsonの読み込みに失敗" : end jsongetobj JsonPtrEvents,"events" jsonnext chilledptr,JsonPtrEvents , 2 jsongetobj message_create,"message_create",chilledptr jsongets old_sender_id,"sender_id",message_create jsonclose wait 100 GetDirectMessage 5 response = getResponseBody() jsonopen jsonPtrRoot, response if (jsonPtrRoot == 0) : dialog "jsonの読み込みに失敗" : end jsongetobj JsonPtrEvents,"events" jsonnext chilledptr,JsonPtrEvents , 2 jsongetobj message_create,"message_create",chilledptr jsongets sender_id,"sender_id",message_create if old_sender_id != sender_id {;sender_idが異なっているかの処理 jsongetobj target,"target",message_create jsongets recipient_id,"recipient_id",target jsongetobj message_data,"message_data",message_create jsongets dmtext, "text", message_data dialog "target "+target+"\nrecipient_id "+recipient_id+"\ntext "+dmtext } jsonclose wait 100 /* mes dmtext mes sender_id mes recipient_id */ loop



この記事に返信する


SMOPU

リンク

2022/6/23(Thu) 00:25:40|NO.96707

インクルード、キー省略してすいません。
TsubuyakiSoup(TwitterAPI)を使っている方だけ回答を願います。



こいる

リンク

2022/6/25(Sat) 09:52:27|NO.96717

なにが、どう、うまくいかないのでしょうか?

また、GetDirectMessage命令はTsubuyakiSoupモジュールには存在しないのですが、中身は以前こちらで書いたものと同じものでしょうか?
https://hsp.tv/play/pforum.php?mode=all&num=95846#96468


提示いただいたスクリプトの処理内容は「最新のDMの送り主を一定間隔で比較し、送り主が異なっていたらdialogを表示」という感じでしょうか。
要は、DMの受信を検知したいのですよね。


▼問題点3つ

SMOPUさんが何に困っているのかが分からないので、とりあえず気づいた問題点3つを書きます。

○1. DM取得のAPI呼び出し制限が15分間に15回なので、15秒間動いた後、残りの14分45秒間は動かなくなってしまう。
解決策: 1分以上の間隔を開けてDMを取得するしかなさそうですね(リアルタイムというには遅延が大きいかもしれませんが)。

○2. 1秒ごとにDMを最新の1件しか確認していないので、1秒間に2件以上DMが来ると最後以外のDMが無視されてしまう(今は1秒間隔ですが実際は最低でも1分以上の間隔が要るため、この問題が発生することは十分にありえます)。
解決策: 取得したDMすべてを比較して、新規のDMを絞り出せば良いと思います。

○3. direct_messages/events/list は受信したDMはもちろん、自分が送信したDMも取得されるので、自分がDMを送信するとそれも検知してしまう。
解決策: sender_idが自身のユーザーIDの場合に弾くようにすれば良いと思います。



こいる

リンク

2022/7/9(Sat) 21:29:57|NO.96769

えーと、私が指摘した問題点3つを修正した感じですか?
まず「どうもうまくいきません…。」というのが、具体的に「なにがどう、うまくいかなかったのか」を教えてほしかったのですが……。


とりあえず、スクリプトについてです。
問題点1「API呼び出し制限」と、問題点3「自身が送信したDM」の件は解消できてると思いますが、問題点2「複数DMの処理」は不完全ですね。
JSONから主要な値を配列に入れるところまでは良いですが、肝心の新規DMの検出が最新の1件を比較しているだけで以前と変わっていません。これでは待機中に2件以上DMが来ても、最新の1件にしか返信されません。

なので、old_id変数にid変数の配列全要素をコピーするようにし、新規DM検出時にidとold_id変数の全要素とを比較することで、前回のDMに含まれていない新規のDMを絞り出すと良いと思います。
以下に前述の処理をしているスクリプトを載せるので、参考にしてください(直接関係ないところは省いてます)。

// ※実際このときold_idは空だが、簡略化のため前回idが1のDMがあったていで old_id = "1" *main // DM取得と、idの配列化(※簡略化のためidは直で代入) id = "1", "2", "3" // 前回のと比較して、新規idを抽出 repeat length(id) _id = id(cnt) is_id_included_in_old = 0 repeat length(old_id) if (_id == old_id(cnt)) { is_id_included_in_old = 1 break } loop if (is_id_included_in_old == 0) { mes "新規: " + _id // ※自アカウントの除外は省略してるので付け足してください } loop // old_id変数にid変数の中身をコピー repeat length(id) old_id(cnt) = id(cnt) loop wait 100 cn++ title str(cn) goto *main



SMOPU

リンク

2022/7/12(Tue) 18:08:46|NO.96793

こんな感じでよいのでしょうか?

自分は1回目のループはDMが絶対に送信されないようにしたいのですが…。
かなり前の受信したDMを取得され、相手の方がなにもDMを送ってないのに送信されるので、相手の方がDMが来たというのを防ぎたいのです。

1回目ループは、DMのIDを記憶だけさせ、2回目以降のループはIDが異なっていたらメッセージを送信する。
という処理をやりたいのですが、フラグで管理するしかないですよね?
あと、相手の方が2回以上メッセージが来ても1回送信する処理をやろうと考えています。

*main GetDirectMessage response = getResponseBody() jsonopen jsonPtrRoot, response if (jsonPtrRoot == 0) : dialog "jsonの読み込みに失敗" : end jsongetobj JsonPtrEvents,"events" jsonnext JsonPtrEvents,JsonPtrEvents , 2 repeat jsongets id(cnt),"id",JsonPtrEvents jsongetobj message_create,"message_create",JsonPtrEvents jsongets sender_id(cnt),"sender_id",message_create jsongetobj message_data,"message_data",message_create jsongets DM_Text(cnt), "text", message_data jsonnext JsonPtrEvents,JsonPtrEvents,0 if JsonPtrEvents = 0:break loop jsonclose if dm_flag = 0 { dm_flag = 1 }else{ repeat length(id) _id = id(cnt) is_id_included_in_old = 0 repeat length(old_id) if (_id == old_id(cnt)) { is_id_included_in_old = 1 break } loop if (is_id_included_in_old == 0) { mes "新規: " + _id // ※自アカウントの除外は省略してるので付け足してください } loop } repeat length(id) old_id(cnt) = id(cnt) loop wait 6000 cn++ title str(cn) goto *main



こいる

リンク

2022/7/14(Thu) 20:30:05|NO.96806

>1回目のループ
SMOPUさんのスクリプト通り、フラグを使い1回目は既存のDMをold_id変数に格納するだけで大丈夫だと思います。

>相手の方が2回以上メッセージが来ても1回送信する処理をやろうと考えています。
「1周期(1分)の間に同じ人から2回以上DMが来た場合に、そのDM数だけ返信するのではなく、1回だけ返信したい」ということですか?
それでしたら、"sender_id"キーでDMを送ったユーザーが識別できるので、周期内で一度返信したDMのsender_idを記録し、返信時にすでに返信したユーザーのDMではないかを確認すれば良いと思います。


本題とは関係ないですが、スクリプトには正しくインデントを付けましょう。
付け方は以前書いたとおりです→ https://hsp.tv/play/pforum.php?mode=all&num=95846#96488
インデントがそろってないと単純に見づらいです。他人はもちろん、スクリプトを書いた自分自身も時間が経てば処理の流れも忘れて見づらいと感じるはずです。
なので、今のうちに習慣づけておくのをオススメします。


ところで、NO.96717とNO.96769の間にあったSMOPUさんの返信がなくなっているのですが、なぜ消したのでしょうか?
今回はさほど問題はありませんが、話の流れが分からなくなったりするので、基本的にレスの削除はお控えいただきたいです。



SMOPU

リンク

2022/7/23(Sat) 18:59:20|NO.96840

返信がかなり遅くなってすいません。ありがとうございます。
API制限に引っ掛かりそうな気がするので、後で試してみます。
あと、スレッドとは少し関係ない話になってしまうのですが、TwitterAPIからプロフィール画像を変更することってできませんか…?
(TwitterAPIを使用する目的は、Twitterをログアウトしている状態でも、PCから直接APIでTwitterを操作すること。連携している限り)
tCup_mod_utf.hspを少し弄って

if (arg == "media")


if (arg == "media") || (arg == "image")
に変える

#deffunc SetTWProFile_icon str _image_ exist _image_ vSize = strsize if (vSize <= 0): return 1 //ファイルが存在しない sdim arguments arguments(0) = "image=" + _image_ execRestApi "account/update_profile_image.json", arguments, METHOD_POST, hProgress if (stat/100) != 2 :return 2 //ステータスコードが失敗 return 0



SMOPU

リンク

2022/7/23(Sat) 19:00:43|NO.96841

>ところで、NO.96717とNO.96769の間にあったSMOPUさんの返信がなくなっているのですが、なぜ消したのでしょうか?
おっとすいません。
スクリプト内に(プライバシー)乗せてはいけないものがあったので削除しました。



こいる

リンク

2022/7/23(Sat) 23:46:25|NO.96843

>TwitterAPIからプロフィール画像を変更することってできませんか…?
tCup_mod_utf.hspのコードをもう少し読んでみましょう。
画像のbase64エンコードは、METHOD_POSTではなくMETHOD_XMPOSTですね。

>スクリプト内に(プライバシー)乗せてはいけないものがあったので削除しました。
そうでしたか。



ONION software Copyright 1997-2023(c) All rights reserved.