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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0326
SMOPUTsuyakiSoup(TwitterAPI)でDMの送信をしたい39解決


SMOPU

リンク

2022/3/26(Sat) 11:41:29|NO.95846

TsubuyakiSoup(TwitterAPI)でDMを送信したいのですが、可能でしょうか?
画像付きのDMも方法があるのなら教えてほしいです。



この記事に返信する


SMOPU

リンク

2022/5/22(Sun) 19:37:23|NO.96410

↓オブジェクト内にキーを入れる必要あるし、どうやっても無理なのかな…。
https://twitter.com/smopu_M/status/1528323761803407360



こいる

リンク

2022/5/24(Tue) 17:50:04|NO.96436

まず、JSONをPOSTできるように"TsubuyakiSoup_mod_u8.hsp"を少し改造します。

1. 475行目を書き換え

if (api != "media/upload.json") { ↓ if (api != "media/upload.json" && api != "direct_messages/events/new.json") {

2. 509行目と510行目の間に、下記を挿入する

} else:if (api == "direct_messages/events/new.json") { RequestHeader += "\r\nContent-Type: application/json"


後は、こんな感じでできました。
メッセージ内容に日本語などのマルチバイト文字を含めたい場合は、Unicodeエスケープシーケンスにしてください。

#include "hsp3utf.as" #include "../TsubuyakiSoup_mod_u8.hsp" #include "key.hsp" #module // p1 = メッセージ内容 // p2 = 送る先のユーザーのID (IDチェッカー https://idtwi.com/ などで確認可能) // p3(省略可) = メディアID #define global SendDM(%1, %2, %3="") _SendDM %1, %2, %3 #deffunc _SendDM str text, str recipient_user_id, str media_id json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text) if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} execRestApi "direct_messages/events/new.json", json, METHOD_POST return stat #global // 初期化 exist "Token.txt" if strsize < 0:dialog "先にSample01を実行しアクセストークンを取得してください":end sdim tokenTxt,strsize+1 bload "Token.txt",tokenTxt notesel tokenTxt noteget ACCESS_TOKEN,1 noteget ACCESS_SECRET,2 noteunsel tCupInit "test", CONSUMER_KEY, CONSUMER_SECRET, 10 setAccessToken ACCESS_TOKEN, ACCESS_SECRET // DMを送信 sdim mediaid imagename = "" // 画像のパス if (imagename != "") { media_upload imagename, length(imagename), mediaid } //SendDM "Hello world", "送る先のユーザーのID", mediaid // レスポンスを表示 response = "##### HEADER ######\n"+getResponseHeader()+"\n\n##### BODY #####\n"+getResponseBody() mesbox response, 640, 480, 4

注意として、TwitterのDeveloper Portalのアプリの設定にある「User authentication settings」で「OAuth 1.0a」をオンにし、「OAUTH 1.0A SETTINGS」内の「App permissions」を「Read and write and Direct message」にして、「Access Token and Secret」をRegenerateしてから「Sample01-GetAccessToken.hsp」を再実行しておいてください。



SMOPU

リンク

2022/5/24(Tue) 22:47:33|NO.96442

別のバージョンのTsubuyakiSoupを使用しているのですが…。
こんな感じで良いんですかね…?

https://twitter.com/smopu_M/status/1529095634632200192

↓以下のソースを実行してみましたが、ヘッダーもレスポンスも表示されてない状態です。
https://twitter.com/smopu_M/status/1529095843122655232

Pythonだったら成功してたのですが…。

#include "hsp3utf.as" #include "user32.as" #include "TsubuyakiSoup_mod_utf.hsp" #module // p1 = メッセージ内容 // p2 = 送る先のユーザーのID (IDチェッカー https://idtwi.com/ などで確認可能) // p3(省略可) = メディアID #define global SendDM(%1, %2, %3="") _SendDM %1, %2, %3 #deffunc _SendDM str text, str recipient_user_id, str media_id json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text) if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} execRestApi "direct_messages/events/new.json", json, METHOD_POST return stat #global CONSUMER_KEY = "" CONSUMER_SECRET = "" ACCESS_TOKEN = "" ACCESS_SECRET = "" tCupInit "testClient", CONSUMER_KEY, CONSUMER_SECRET, 10 setAccessToken ACCESS_TOKEN, ACCESS_SECRET SendDM "Hello world", "1497587485484150793" // レスポンスを表示 response = "##### HEADER ######\n"+getResponseHeader()+"\n\n##### BODY #####\n"+getResponseBody() mesbox response, 640, 480, 4



SMOPU

リンク

2022/5/24(Tue) 23:27:56|NO.96443

tCup_modのソースいじったら、一切ツイートできなくなってしまいました。
https://twitter.com/smopu_M/status/1529100474049507329

一応ソースを載せておきます。
https://xfs.jp/tu1BGH



SMOPU

リンク

2022/5/24(Tue) 23:29:34|NO.96444

エラー内容は

The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.
とのことです。



SMOPU

リンク

2022/5/24(Tue) 23:45:46|NO.96445

tCup_mod_utf.hsp をいじる前にバックアップ取るの忘れてしまいました…



こいる

リンク

2022/5/25(Wed) 00:50:17|NO.96447

すみません、まず訂正を。改造するのは"TsubuyakiSoup_mod_u8.hsp"ではなく"tCup_mod_u8.hsp"でした。


ファイル名が違うとは思っていましたが、バージョンが違うんですね……。
バージョンが違うのではしょうがないのですが、NO.96442の https://twitter.com/smopu_M/status/1529095634632200192 のコードは間違っています。自分もあまり深くは理解できていないのですが、手順1は、リクエストのヘッダーに引数を追加させないためのもので、RequestURLは関係ないです。


NO.96444のエラー内容の感じからして、Twitter API v1.1に対応する前のTsubuyakiSoupを使っているのではないでしょうか?

自分は、最新のTsubuyakiSoupをinoviaさんがhsp3utfに対応されているバージョンを使っているので、こちらに切り替えてみてはいかがでしょうか?
https://github.com/inovia/TsubuyakiSoup_mod_u8


ちなみに、単純な疑問なのですがお持ちのTsubuyakiSoupはどこから入手したのでしょう?
GitHubのオリジナル・フォークのコミット履歴などを軽く調べてみましたが分かりませんでした。



SMOPU

リンク

2022/5/25(Wed) 05:46:39|NO.96451

動画付きアップロードのTsubyakiSoupを利用していました。
今見たら、 tCup_mod_utf.hsp のバックアップが残っていました。

>ちなみに、単純な疑問なのですがお持ちのTsubuyakiSoupはどこから入手したのでしょう?
>GitHubのオリジナル・フォークのコミット履歴などを軽く調べてみましたが分かりませんでした。
とある人から、TwitterのDMでモジュールをもらったものです。どこでDLしたかは忘れました。
commonフォルダに入れていて、を入れ替えてみたら、問題なくツイートはできたのですが、tCup_mod_utf.hsp のどこの部分を入れ替えたらいいのか教えていただければ幸いです。
一応ファイル上げておきます。

TsubuyakiSoup_mod_utf.hsp
https://drive.google.com/file/d/1-KyxWfKwCI6RmzCXZVScvrco6vSluAys/view?usp=sharing

tCup_mod_utf.hsp
https://drive.google.com/file/d/1-VcQTvlGWySiQFDT9X_2xo8pFDOUigMv/view?usp=sharing

TsubuyakiSoup_mod_u8.hsp の#func が InternetOpenA(Shift-JIS用) で、TsubuyakiSoup_mod_utf.hsp の #func が InternetOpenW (Unicode用)なので、こっちの方が安定しているのかもしれませんが…。



SMOPU

リンク

2022/5/25(Wed) 16:28:59|NO.96452

動画付きDMを行うことは可能ですよね?
dm_videoに変えたら問題なくメッセージを送ることは可能でしょうか?
通常文字列をUnicodeエスケープシーケンスを変換するには、どうすればいいのでしょうか?
変換はいくらググっても見つかりませんでした。



こいる

リンク

2022/5/25(Wed) 20:42:17|NO.96453

すみません、また訂正です。NO.96436のコードの65行目にある if (imagename != "") の波括弧のスタイルが間違っていました。{ が新しい行にありますがif文と同じ行に移動させてください。


なるほど、動画付きアップロード対応のですか。
NO.96451のファイルですが、アクセス権限がないので見えないです……。Googleドライブだと思いますが、ファイル右クリックメニューの「リンクを取得」から、「制限付き」を「リンクを知っている全員」に変更すれば見えるようになると思います。

>TsubuyakiSoup_mod_u8.hsp の#func が InternetOpenA(Shift-JIS用) で、TsubuyakiSoup_mod_utf.hsp の #func が InternetOpenW (Unicode用)なので、こっちの方が安定しているのかもしれませんが…。
モジュール内で扱う文字コードが違うだけで、動作に影響はないはずです。
たしか、#funcでsptrやwptrと指定されている引数に渡した文字列は、勝手にその文字コードにエンコードされるので、そもそもUTF-8とかUTF-16に変換する必要自体なかったはず……。


>tCup_mod_utf.hsp のどこの部分を入れ替えたらいいのか教えていただければ幸いです。
NO.96443で頂いた"tCup_mod_utf.hsp"を改めて見てみたところ、すでに RequestHeader += "\r\nContent-Type: application/json の処理があったので、NO.96436の改造は要らないかもしれません。

TsubuyakiSoup_mod_utf.hspもtCup_mod_utf.hspも、TsubuyakiSoup_mod_u8(NO.96447参照)のものに丸々置き換えるのが一番良いと思うのですが、どうやらTsubuyakiSoup_mod_u8は動画のアップロードには対応していないみたいですね……。

それと、NO.96447で
「NO.96444のエラー内容の感じからして、Twitter API v1.1に対応する前のTsubuyakiSoupを使っているのではないでしょうか?」
と書きましたが、NO.96443のtCup_mod_utf.hspをざっと見た限り、すでにv1.1を使ってるっぽいです。なぜそのエラーが出たのか謎ですね……。


>動画付きDMを行うことは可能ですよね?
Twitter APIの仕様上は可能だと思いますが、TsubuyakiSoup_mod_u8では出来ないです。

>dm_videoに変えたら問題なくメッセージを送ることは可能でしょうか?
dm_videoとは何でしょう? TsubuyakiSoup_mod_utfにある命令でしょうか。

>通常文字列をUnicodeエスケープシーケンスを変換するには、どうすればいいのでしょうか?
こんな感じでできると思います。
作成に当たり、こちらのページを大いに参考にさせていただきました。
https://www.kwonline.org/memo2/2014/11/21/unicode-escape-sequence-%e5%a4%89%e6%8f%9b%e3%83%84%e3%83%bc%e3%83%ab/

#module convert_to_ues #uselib "kernel32.dll" #func lstrlenW "lstrlenW" int #defcfunc ConvertToUnicodeEscapeSequence str p1 text_utf16="" cnvstow text_utf16, p1 result="" repeat lstrlenW(varptr(text_utf16)) code = wpeek(text_utf16, cnt * 2) result += strf("\\u%04x", code) loop return result #global mes ConvertToUnicodeEscapeSequence("Hello World. こんにちは世界。")


■まとめ
とりあえず、お持ちのtCup_mod_utf.hspを改造せずに、NO.96442のコードをもう一度実行してみてください。
正常に動くのであれば解決、動かないのであればtCup_mod_utf.hspを改造するか、TsubuyakiSoup_mod_u8を画像アップロードに対応させて使いましょう。



SMOPU

リンク

2022/5/25(Wed) 21:27:46|NO.96455

すいません、これでDLできると思います。

TsubuyakiSoup_mod_utf.hsp
https://drive.google.com/file/d/1-KyxWfKwCI6RmzCXZVScvrco6vSluAys/view

tCup_mod_utf.hsp
https://drive.google.com/file/d/1-VcQTvlGWySiQFDT9X_2xo8pFDOUigMv/view

↓こちらのスクリプトでは、問題なく動画ツイートできることを確認しました。

#include "hsp3utf.as" #include "TsubuyakiSoup_mod_utf.hsp" #include "key.hsp" exist "Token.txt" datasize = strsize if datasize > 0{ sdim data,datasize+1 bload "Token.txt",data } else { dialog "先に key.hsp にCONSUMER_KEYとCONSUMER_SECRETを登録し、01_gettoken.hsp を実行してアクセストークンを取得してから実行してください。",1 end } notesel data noteget ACCESS_TOKEN,1 noteget ACCESS_SECRET,2 tCupInit "testClient", CONSUMER_KEY, CONSUMER_SECRET, 10 setAccessToken ACCESS_TOKEN, ACCESS_SECRET /* media_upload 関数 p1 ファイル名(相対パス)や絶対パスの配列変数 p2 アップロードする画像ファイル数 p3 取得するメディアID(文字列) */ sdim videoname,256 videoname(0) = "filename.mp4" video_upload videoname,mediaid if stat ! 0 { dialog "動画投稿失敗"+stat,1 }else{ Tweet "動画投稿テスト",,mediaid if stat = 200{ dialog "ツイートに成功しました。" }else{ dialog "ツイートに失敗しました。"+stat,1 } mediaid = "" } objmode 0 response = "##### HEADER ######\n"+getResponseHeader()+"##### BODY #####\n"+getResponseBody() mesbox response,640,480,4 stop



こいる

リンク

2022/5/25(Wed) 23:20:39|NO.96459

ダウンロードはできましたが、"mbase64.as"と"jsonParse_utf.as"というファイルがないので実行できませんでした。
とりあえず、"mbase64.as"は https://hsp.moe/#mbase64 からダウンロードした"mbase64.hsp"をリネームし、"jsonParse_utf.as"はTsubuyakiSoup_mod_u8のjsonParse_u8.asをリネームして実行してみました。

NO.96455の動画付きツイートの動作確認はできたので、互換性はありそうです。


肝心のDM送信は……できませんでした(そのままでは)。
RequestHeader += "\r\nContent-Type: application/json があったのは、SMOPUさんの改造の跡でしたね。

なので、tCup_mod_utf.hspをNO.96436と同じように改造します。

1. 465行目を書き換え

if (methodType != METHOD_XMPOST) { ↓ if (methodType != METHOD_XMPOST && api != "direct_messages/events/new.json") {

2. 583行目と584行目の間に、下記を挿入する

} else:if (api == "direct_messages/events/new.json") { RequestHeader += "\r\nContent-Type: application/json"

これでNO.96436のモジュールで、DMの送信ができるようになります。


動画を添付したい場合は、こうします。
第4引数に 1 を渡すとDM用にアップロードしてくれるみたいです。なぜか"video_upload"マクロには第4引数がないので、"video_upload_"命令本体を呼び出しています。

(前略) sdim mediaid video_upload_ "動画ファイル名", mediaid, , 1 SendDM "Hello World", "ユーザーID", mediaid



SMOPU

リンク

2022/5/26(Thu) 18:49:15|NO.96466

>第4引数に 1 を渡すとDM用にアップロードしてくれるみたいです。なぜか"video_upload"マクロには第4引数がないので、"video_upload_"命令本体を呼び出しています。
TwitterAPIリファレンスに、dm_videoを指定すると書いてあったので、4引数に1にしたら、DM用の動画にするようにしていましたが、

#define global video_upload(%1,%2,%3=0,%4=0) video_upload_ %1,%2,%3,%4
ここを変えるの忘れていました。
とりあえず、DMは成功しましたが、Unicodeエスケープシーケンス変換でサロゲートペアの文字が含まれていると「パラメーターの値が異常です」というエラーが出ます。なんとかならないですかねぇ…
あと、Twitterのダイレクトメッセージを取得する方法ってないのでしょうか。

#include "hsp3utf.as" #include "TsubuyakiSoup_mod_utf.hsp" #include "key.hsp" #module // p1 = メッセージ内容 // p2 = 送る先のuser_id (IDチェッカー http://tik.dignet.info/web/idname/ で確認可能) // p3(省略可) = メディアID #uselib "kernel32.dll" #func lstrlenW "lstrlenW" int #defcfunc ConvertToUnicodeEscapeSequence str p1 text_utf16="" cnvstow text_utf16, p1 result="" repeat lstrlenW(varptr(text_utf16))+8 code = wpeek(text_utf16, cnt * 2) result += strf("\\u%04x", code) loop return result #define global SendDM(%1, %2, %3="") _SendDM %1, %2, %3 #deffunc _SendDM str p1, str recipient_user_id, str media_id text = ConvertToUnicodeEscapeSequence(p1) json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text) if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} execRestApi "direct_messages/events/new.json", json, METHOD_POST return stat #global exist "Token.txt" datasize = strsize if datasize > 0{ sdim data,datasize+1 bload "Token.txt",data } else { dialog "先に key.hsp にCONSUMER_KEYとCONSUMER_SECRETを登録し、01_gettoken.hsp を実行してアクセストークンを取得してから実行してください。",1 end } notesel data noteget ACCESS_TOKEN,1 noteget ACCESS_SECRET,2 tCupInit "testClient", CONSUMER_KEY, CONSUMER_SECRET, 10 setAccessToken ACCESS_TOKEN, ACCESS_SECRET // DMを送信 sdim mediaid imagename = "" // 動画のパス if (imagename != ""){ video_upload imagename, mediaid, , 1 } SendDM "メッセージ本文", "ここにuser_idを入力", mediaid if stat = 200{ dialog "成功" }else{ dialog "失敗"+stat,1 } objmode 2 pos 0,0 _response = "##### HEADER ######\n"+getResponseHeader()+"\n##### BODY #####\n"+getResponseBody() mesbox _response,640,480,4 stop
Unicodeエスケープシーケンス変換でエラーが出る系

#include "hsp3utf.as" #module convert_to_ues #uselib "kernel32.dll" #func lstrlenW "lstrlenW" int #defcfunc ConvertToUnicodeEscapeSequence str p1 text_utf16="" cnvstow text_utf16, p1 result="" repeat lstrlenW(varptr(text_utf16)) code = wpeek(text_utf16, cnt * 2) result += strf("\\u%04x", code) loop return result #global tex = ConvertToUnicodeEscapeSequence("あいうえおかきくけこさしすせそたちつてと🤣🤣🤣💦🤔🤪✌️") mesbox tex,640,480,4



SMOPU

リンク

2022/5/26(Thu) 21:30:58|NO.96467

あと、ちなみにクイック返信もできるんですかね?
Pythonではやったことはあるのですが、HSPのTsubuyakiSoupの場合はこんな感じでいいのでしょうか?

quick_dm(0)="test" quick_dm_desc(0)="test" media_id = "2" json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text) if (quick_dm(0) != ""){ json += strf({" , "quick_reply": { "type": "options", "options": [ { "label": "%s", "}, quick_dm(0)) if quick_dm_desc(0) != ""{ json += strf({" "description": "%s" "},quick_dm_desc) } if (quick_dm(0) != ""){ json += {" } ] } "} } } if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "}

クイック返信は配列変数で例えば、

quickdm(0) = "クイック返信1" description(0) = "説明欄A" quickdm(1) = "クイック返信2" description(1) = "説明欄B" SendDM "Hello world", "",,quickdm,description
としたらクイック返信が表示されるようにしたいです。
https://okadak1990.hatenablog.com/entry/2019/01/22/161541
ここを見ながらやりました。



こいる

リンク

2022/5/26(Thu) 22:33:36|NO.96468

>Unicodeエスケープシーケンス変換でサロゲートペアの文字が含まれていると「パラメーターの値が異常です」というエラーが出ます。
おっとcnvstow命令は自動でバッファ確保してくれないんですね。
モジュール内のtext_utf16変数の初期化処理を、下記のように直せば解決すると思います。

text_utf16="" ↓ sdim text_utf16, strlen(p1) * 2 + 2

余談ですが、自分はコンパイル・実行にhspcというツールを使っているのですが、ある程度の日本語を含ませないとaオプションによるUTF-8自動判定が効かないみたいですね。


>Twitterのダイレクトメッセージを取得する方法ってないのでしょうか。
video_upload命令の改造ができるくらいTsubuyakiSoupを理解してTwitterのドキュメントも読めるのであれば、もう少しご自分で調べればできそうですが……。

とりあえずまあこんな感じでできます。結果はツイート取得時と同じようにjsonで返ってきます。

#module #include "hsp3utf.as" #include "TsubuyakiSoup_mod_utf.hsp" #include "key.hsp" #module // p1(省略可) = 取得する数 #deffunc GetDM int count argument="" if (count != 0) : argument(0) = "count=" + str(count) execRestApi "direct_messages/events/list.json", argument, METHOD_GET return stat #global // 初期化処理(省略) GetDM json = getResponseBody() mesbox json, 640, 480, 4


>クイック返信
機能自体いまいちピンときていないのですが、Twitterのドキュメントを見る限り、NO.96436のSendDMモジュールのJSONを書き換えれば可能だと思います(もう知ってらっしゃるとは思いますが)。
少し疲れたので細かい返信は明日にさせてください。

とりあえずご自身で試行錯誤してみて、それでも解決出来ない場合は "どこ/なにが分からないのか" をしっかり明記して再度質問してください。



SMOPU

リンク

2022/5/27(Fri) 18:01:45|NO.96476

SendDM関数に第4引数でクイック返信を追加できるようにしてほしいです。第5引数にdescriptionの追加とか
どうしてもjsonの記述が悪く、うまくいきません。
どこを修正すればいいのでしょうか?

quick_dm="test","next" quick_dm_desc="test","next" media_id = "" json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text) if (quick_dm(0) != ""){ json += {" , "quick_reply": { "type": "options", "options": [ { "} repeat length(quick_dm) json += strf("{\n\"label\": \"%s\",\n",quick_dm(cnt)) if quick_dm_desc(cnt) != ""{ json += strf({" "description": "%s" "},quick_dm_desc(cnt)) } json += "}" if cnt>length(quick_dm):json += "," loop if (quick_dm(0) != ""){ json += {" } ] } "} } } if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} mesbox json,640,480,4
mesboxで確認してみたところ、jsonの記述がおかしくなっています。



こいる

リンク

2022/5/27(Fri) 19:56:04|NO.96477

まず訂正です。NO.96468のDM取得のコードの先頭行にある"#module"はただのミスなので消してください。

クイック返信とは、受信者が選択して返信できる定型文のことを言うんですね。
https://business.twitter.com/ja/help/campaign-editing-and-optimization/quick-replies.html


>どこを修正すればいいのでしょうか?
コードのインデントが大変なことになってるのは置いといて……

まずは、できたJSONをVSCodeなどでフォーマットして見やすくしてみましょう。

{ "event": { "type": "message_create", "message_create": { "target": { "recipient_id": 0 }, "message_data": { "text": "0", "quick_reply": { "type": "options", "options": [ { { "label": "test", "description": "test" }{ "label": "next", "description": "next" } } ] } } } } }

問題点は2つ。

1つ目は、"options"配列の中に、オブジェクトがあって、さらにその中にlabelとdescriptionメンバーを含むオブジェクト(便宜上、以降"オプションオブジェクト"と呼びます)がありますが、最初のオブジェクトは不要です。配列内に直接オプションオブジェクトを並べてください。
2つ目は、オプションオブジェクト同士の間にカンマが入っていないことです。配列内のオブジェクト間にはカンマが必要です。

それと、27行目でlabelメンバーの末尾にカンマを付けていますが、29行目のif文内でカンマを付けたほうが良いです。quick_dm_desc(cnt) が空だった場合に、不要なカンマが残ってJSONの構文エラーになってしまいます。


>mesboxで確認してみたところ、jsonの記述がおかしくなっています。
"{}"構文で複数行文字列リテラルを書いた場合、先頭の空白がなくなる仕様なので、JSONのインデントが消えます。
ただし、JSONの構文上、インデントはなくてもいいので、Twitter APIに渡す分には問題ありません。


ちなみに、クイック返信は自分宛に送った場合は表示されないっぽいので、動作確認する場合は、自分の別アカウントに送る必要がありそうです。



SMOPU

リンク

2022/5/27(Fri) 23:02:31|NO.96478

自力でモジュールを改造して、クイック返信をできるようにし、関数のパラメーターを増やすと長くなってしまうので、配列変数でクイック返信を指定できるようにし、サブアカウントの方からメインアカウントの方に、APIでクイック返信付きメッセージが送れたことは確認できました。

↓完成できたモジュール

#define global SendDM_quick(%1, %2, %3="",%4,%5) _SendDM_quick_ %1, %2, %3, %4, %5 #deffunc _SendDM_quick_ str p1 , str recipient_user_id , str media_id , array quick_dm , array quick_dm_desc text_DM = ConvertToUnicodeEscapeSequence(p1) json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text_DM) if (quick_dm(0) != ""){ json += {" , "quick_reply": { "type": "options", "options": [ "} repeat length(quick_dm) quick_dm(cnt) = ConvertToUnicodeEscapeSequence(quick_dm(cnt)) json += strf("{\n\"label\": \"%s\"\n",quick_dm(cnt)) if quick_dm_desc(cnt) != "" { quick_dm_desc(cnt) = ConvertToUnicodeEscapeSequence(quick_dm_desc(cnt)) json += strf({" ,"description": "%s" "},quick_dm_desc(cnt)) } json += "}\n" if length(quick_dm) != cnt+1:json += "," loop if (quick_dm(0) != ""){ json += {" ] } "} } } if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} execRestApi "direct_messages/events/new.json", json, METHOD_POST return stat

クイック返信の引数が侵略されたら、エラーが出ないようにしたいのですが、侵略されたらクイック返信なしDMにすることはできないのでしょうか?
ちなみに、クイック返信はいくつまで増やせますか?
一応関数名をSendDM_quickに変えてみました

//コンシューマーキー取得省略 label = "あいうえお","かきくけこ","さしすせそ" description = "アイウエオ","カキクケコ","サシスセソ" SendDM_quick "クイック返信テスト","user_id",,label,description if stat = 200{ dialog "成功" }else{ dialog "失敗"+stat,1 } objmode 2 pos 0,0 _response = "##### HEADER ######\n"+getResponseHeader()+"\n##### BODY #####\n"+getResponseBody() mesbox _response,640,480,4



SMOPU

リンク

2022/5/27(Fri) 23:10:34|NO.96479

あと、ここを変えるとAPIからのエラーが出ちゃいますね…
""にしたら、descriptionを追加させないようにしたいのですが、よろしくお願いします。

label = "あいうえお","かきくけこ","さしすせそ" description = "アイウエオ","","" SendDM_quick "クイック返信テスト","1477043699662340096",,label,description



SMOPU

リンク

2022/5/28(Sat) 10:16:50|NO.96483

クイック返信のモジュールはこんな感じで問題ないですよね?
一応修正はしたのですが…。

#define global SendDM_quick(%1, %2, %3="",%4,%5) _SendDM_quick_ %1, %2, %3, %4, %5 #deffunc _SendDM_quick_ str p1 , str recipient_user_id , str media_id , array quick_dm , array quick_dm_desc text_DM = ConvertToUnicodeEscapeSequence(p1) json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text_DM) if (quick_dm(0) != ""){ json += {" , "quick_reply": { "type": "options", "options": [ "} repeat length(quick_dm) if quick_dm(cnt) != "" { quick_dm(cnt) = ConvertToUnicodeEscapeSequence(quick_dm(cnt)) json += strf("{\n\"label\": \"%s\"\n",quick_dm(cnt)) if quick_dm_desc(cnt) != "" { quick_dm_desc(cnt) = ConvertToUnicodeEscapeSequence(quick_dm_desc(cnt)) json += strf({" ,"description": "%s" "},quick_dm_desc(cnt)) } json += "}\n" if length(quick_dm) != cnt+1 { if quick_dm(cnt+1) != "" : json += ",\n" } } loop if (quick_dm(0) != ""){ json += {" ] } "} } } if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} execRestApi "direct_messages/events/new.json", json, METHOD_POST return stat



こいる

リンク

2022/5/28(Sat) 11:19:45|NO.96485

>侵略されたらクイック返信なしDMにすることはできないのでしょうか?
侵略ではなく「省略」ですかね。
HSPの仕様上、varやarrayによる変数指定の省略はできないので、マクロで引数省略時にダミー変数を渡すか、クイック返信できるもの/できないもの で命令を分けるしかないですね。


>クイック返信はいくつまで増やせますか?
ドキュメントを読みましょう。
https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/new-event

「Message Data Object」の「quick_reply.type (optional)」内に、「20 max」と書いてあります。


>あと、ここを変えるとAPIからのエラーが出ちゃいますね…
>""にしたら、descriptionを追加させないようにしたいのですが、よろしくお願いします。
Twitter APIからのレスポンスのボディに、エラー内容がJSON形式で返ってるはずです。
エラー文を翻訳するなり、エラーコードを調べるなりしてみましょう。


>クイック返信のモジュールはこんな感じで問題ないですよね?
作成されたJSONを確認する限り、問題ないと思います。labelメンバーの末尾にあったカンマもしっかり修正されてますね。

ちなみに、コードのインデントがバラバラで大変見づらいので、インデントはしっかり揃えた方が良いですよ。



SMOPU

リンク

2022/5/28(Sat) 12:38:17|NO.96487

>作成されたJSONを確認する限り、問題ないと思います。labelメンバーの末尾にあったカンマもしっかり修正されてますね。
配列変数に""だったら、処理しないようにしたいんですけど…。しっかり末尾にカンマが出てこないです。
>ちなみに、コードのインデントがバラバラで大変見づらいので、インデントはしっかり揃えた方が良いですよ。
どうやって、揃えたらいいんですかね。

#include "hsp3utf.as" #module #uselib "kernel32.dll" #func lstrlenW "lstrlenW" int #defcfunc ConvertToUnicodeEscapeSequence str p1 sdim text_utf16, strlen(p1) * 2 + 2 cnvstow text_utf16, p1 result="" repeat lstrlenW(varptr(text_utf16))+8 code = wpeek(text_utf16, cnt * 2) result += strf("\\u%04x", code) loop strrep result,"\\u0000","" return result #define global SendDM_quick(%1, %2, %3="",%4="",%5="") _SendDM_quick_ %1, %2, %3, %4, %5 #deffunc _SendDM_quick_ str p1 , str recipient_user_id , str media_id , array quick_dm , array quick_dm_desc text_DM = ConvertToUnicodeEscapeSequence(p1) json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text_DM) if (quick_dm(0) != ""){ json += {" , "quick_reply": { "type": "options", "options": [ "} repeat length(quick_dm) if quick_dm(cnt) != "" { quick_dm(cnt) = ConvertToUnicodeEscapeSequence(quick_dm(cnt)) json += strf("{\n\"label\": \"%s\"\n",quick_dm(cnt)) if quick_dm_desc(cnt) != "" { quick_dm_desc(cnt) = ConvertToUnicodeEscapeSequence(quick_dm_desc(cnt)) json += strf({" ,"description": "%s" "},quick_dm_desc(cnt)) } json += "}\n" if length(quick_dm) != cnt+1 { if quick_dm(cnt+1) != "" : json += ",\n" } } loop if (quick_dm(0) != ""){ json += {" ] } "} } } if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} return json #global quick = "テスト1","","","テスト4" description = "一","","","テスト四" SendDM_quick "あいうえお","1","0",quick,description json =refstr mesbox json,640,480,4



こいる

リンク

2022/5/28(Sat) 13:00:30|NO.96488

>配列変数に""だったら、処理しないようにしたいんですけど…。しっかり末尾にカンマが出てこないです。
すみません質問の意味が分かりません。

quick_dmに空の配列変数を渡された場合にクイック返信のJSONを追加しない、というのであればすでに達成されてるように思いますが。
末尾にカンマが出てこない、とは……?


>どうやって、揃えたらいいんですかね。
まず、下記のところはインデントを増やしてください。
・#deffunc/#defcfunc内
・repeat〜loop内
・if内

「if内にrepeatがある」などネストしている場合には、インデントも重ねて増やしてください。

インデントを揃えたものがこちらです。
if (quick_dm(0) != "") の中にあるコードや、どこからどこまでrepeat〜loopしているのかが一目瞭然になったと思います。

#include "hsp3utf.as" #module #uselib "kernel32.dll" #func lstrlenW "lstrlenW" int #defcfunc ConvertToUnicodeEscapeSequence str p1 sdim text_utf16, strlen(p1) * 2 + 2 cnvstow text_utf16, p1 result="" repeat lstrlenW(varptr(text_utf16))+8 code = wpeek(text_utf16, cnt * 2) result += strf("\\u%04x", code) loop strrep result,"\\u0000","" return result #define global SendDM_quick(%1, %2, %3="",%4="",%5="") _SendDM_quick_ %1, %2, %3, %4, %5 #deffunc _SendDM_quick_ str p1 , str recipient_user_id , str media_id , array quick_dm , array quick_dm_desc text_DM = ConvertToUnicodeEscapeSequence(p1) json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id, text_DM) if (quick_dm(0) != ""){ json += {" , "quick_reply": { "type": "options", "options": [ "} repeat length(quick_dm) if quick_dm(cnt) != "" { quick_dm(cnt) = ConvertToUnicodeEscapeSequence(quick_dm(cnt)) json += strf("{\n\"label\": \"%s\"\n",quick_dm(cnt)) if quick_dm_desc(cnt) != "" { quick_dm_desc(cnt) = ConvertToUnicodeEscapeSequence(quick_dm_desc(cnt)) json += strf({" ,"description": "%s" "},quick_dm_desc(cnt)) } json += "}\n" if length(quick_dm) != cnt+1 { if quick_dm(cnt+1) != "" : json += ",\n" } } loop if (quick_dm(0) != ""){ json += {" ] } "} } } if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} return json #global quick = "テスト1","","","テスト4" description = "一","","","テスト四" SendDM_quick "あいうえお","1","0",quick,description json =refstr mesbox json,640,480,4



こいる

リンク

2022/5/28(Sat) 13:07:18|NO.96489

NO.96487のコードにある、ConvertToUnicodeEscapeSequence命令の

repeat lstrlenW(varptr(text_utf16))+8
の末尾の +8 と、


strrep result,"\\u0000",""
は要らないと思うのですが、どういう意図で追加してるのでしょうか?


NO.96453のコードを、NO.96468の通りに修正しただけで十分機能すると思うのですが、なにか処理できない文字がありましたか?



SMOPU

リンク

2022/5/28(Sat) 14:55:58|NO.96491

おお、ありがとうございます。

>NO.96453のコードを、NO.96468の通りに修正しただけで十分機能すると思うのですが、なにか処理できない文字がありましたか?
クイック返信が豆腐の文字が表示されていたので、変えたらstrrep命令で0が含まれる改善すると思い、追加しました。

あと、ちなみにHSPからウェルカムメッセージを指定したいのですが、どうやっても失敗します。
Pythonではできたのですが、HSPからウェルカムメッセージを指定することはできませんよね?
とりあえず、ウェルカムメッセージを指定できたら、このスレッドは解決することにします。

#include "hsp3utf.as" #include "TsubuyakiSoup_mod_utf.hsp" #module #uselib "kernel32.dll" #func lstrlenW "lstrlenW" int #defcfunc ConvertToUnicodeEscapeSequence str p1 sdim text_utf16, strlen(p1) * 2 + 2 cnvstow text_utf16, p1 result="" repeat lstrlenW(varptr(text_utf16))+8 code = wpeek(text_utf16, cnt * 2) result += strf("\\u%04x", code) loop strrep result,"\\u0000","" return result #define global SendDM_quick(%1, %2, %3="",%4="",%5="") _SendDM_quick_ %1, %2, %3, %4, %5 #deffunc _SendDM_quick_ str p1 , str recipient_user_id , str media_id , array quick_dm , array quick_dm_desc text_DM = ConvertToUnicodeEscapeSequence(p1) text_DM = ConvertToUnicodeEscapeSequence(p1) json = strf({" { "event": { "type": "message_create", "message_create": { "target": { "recipient_id": %s }, "message_data": { "text": "%s" "}, recipient_user_id,text_DM) if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } } "} return json #define global SetWelcomeMessage(%1, %2="",%3,%4) _SetWelcomeMessage_ %1, %2, %3, %4 #deffunc _SetWelcomeMessage_ str p1 , str media_id , array quick_dm , array quick_dm_desc text_DM = ConvertToUnicodeEscapeSequence(p1) json = strf({" { "welcome_message" : { "message_data": { "text": "%s" "}, text_DM) if (quick_dm(0) != ""){ json += {" , "quick_reply": { "type": "options", "options": [ "} repeat length(quick_dm) if quick_dm(cnt) != "" { quick_dm(cnt) = ConvertToUnicodeEscapeSequence(quick_dm(cnt)) json += strf("{\n\"label\": \"%s\"\n",quick_dm(cnt)) if quick_dm_desc(cnt) != "" { quick_dm_desc(cnt) = ConvertToUnicodeEscapeSequence(quick_dm_desc(cnt)) json += strf({" ,"description": "%s" "},quick_dm_desc(cnt)) } json += "}\n" if length(quick_dm) != cnt+1 { if quick_dm(cnt+1) != "" : json += ",\n" } } loop if (quick_dm(0) != ""){ json += {" ] } "} } } if (media_id != "") { json += strf({" , "attachment": { "type": "media", "media": { "id": %s } } "}, media_id) } json += {" } } } "} execRestApi "direct_messages/welcome_messages/new.json", json, METHOD_POST return stat #global CONSUMER_KEY = "" CONSUMER_SECRET = "" ACCESS_TOKEN = "" ACCESS_SECRET = "" exist "keytoken.txt" if strsize < 0 : dialog "KEY TOKENを取得してから実行してください。\nhttps://developer.twitter.com/en/apps からKEYを取得できます。",1:end notesel keytoken noteload "keytoken.txt" noteget CONSUMER_KEY,1 noteget CONSUMER_SECRET,3 noteget ACCESS_TOKEN,5 noteget ACCESS_SECRET,7 if CONSUMER_KEY = "" | CONSUMER_SECRET = "" | ACCESS_TOKEN = "" | ACCESS_SECRET = "" { dialog "KEY TOKENを取得してから実行してください。\nhttps://developer.twitter.com/en/apps からKEYを取得できます。",1:end end } tCupInit "testClient", CONSUMER_KEY, CONSUMER_SECRET, 10 setAccessToken ACCESS_TOKEN, ACCESS_SECRET ;Tweet "ツイートする文章を入力","リプライID(文字列)","画像/動画メディアID(文字列)" quick = "" description = "" SetWelcomeMessage "ウェルカムメッセージテスト","",quick,description sdim quick sdim description if stat = 200{ dialog "成功" }else{ dialog "失敗"+stat,1 } objmode 2 pos 0,0 _response = "##### HEADER ######\n"+getResponseHeader()+"\n##### BODY #####\n"+getResponseBody() mesbox _response,640,480,4 stop
ここを見ながらやりました。
https://irucabot.com/blog/twitterapi/welcomemessage_py/



こいる

リンク

2022/5/28(Sat) 15:39:03|NO.96493

>クイック返信が豆腐の文字が表示されていたので、変えたらstrrep命令で0が含まれる改善すると思い、追加しました。
えーと、よく分かりません……。「豆腐の文字」というのは、自分で入力した文字ではないのですか?
不具合があるのであれば徹底して直しておきたいので、意味の通る文で説明していただけると幸いです。


>HSPからウェルカムメッセージを指定することはできませんよね?
ドキュメントを読む限りは、できそうですね。


DM送信時と同じようにJSONをPOSTする必要があるので、まずNO.96459で行ったtCup_mod_utf.hspの改造部分に少し付け足します。

1. NO.96459の手順1のif文に、下記の条件を追加

&& api != "direct_messages/welcome_messages/new.json" && api != "direct_messages/welcome_messages/rules/new.json"

2. NO.96459の手順2のif文に、下記の条件を追加

|| api == "direct_messages/welcome_messages/new.json" || api == "direct_messages/welcome_messages/rules/new.json"


後は、ドキュメントを見てJSONを作ってPOSTすればできると思います。
https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/new-welcome-message
https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/new-welcome-message-rule



SMOPU

リンク

2022/5/28(Sat) 19:31:12|NO.96495

ありがとうございます。
後で試そうと思いますが、direct_messages/welcome_messages/destroy.json も同じように

api =! "direct_messages/welcome_messages/destroy.json"


api == "direct_messages/welcome_messages/destroy.json"
も追加する必要もありますよね?
direct_messages/welcome_messages/destroy.json の疑問符の後に、IDを入れるみたいなんですが、どうなんですかね。



こいる

リンク

2022/5/28(Sat) 20:41:06|NO.96496

いいえ、追加する必要はありません。というか追加すると動作しなくなります。

ドキュメントの「Response formats」にレスポンスの形式が書かれているので見てみてください。
direct_messages/welcome_messages/new.json は「JSON」とありますが、
direct_messages/welcome_messages/destroy.json は「204 - No Content」とあります。
https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/delete-welcome-message

>direct_messages/welcome_messages/destroy.json の疑問符の後に、IDを入れるみたいなんですが、どうなんですかね。
Tweet命令のように、arguments = "id=" + id としたのをexecRestApi命令の第二引数に渡せばいいと思います。



SMOPU

リンク

2022/5/28(Sat) 22:56:28|NO.96499


#deffunc DeleteWelcomeMessage str id arguments = "id=" + id execRestApi "direct_messages/welcome_messages/destroy.json", arguments,METHOD_DELETE return stat
これで合っていますよね…?
がしかし、

--------------------------- Error --------------------------- #Error 6 in line 627 (tCup_mod_utf.hsp) -->パラメータの型が違います --------------------------- OK ---------------------------
というエラー出てしまいます。



こいる

リンク

2022/5/29(Sun) 10:56:10|NO.96502

METHOD_DELETEの時に、RequestHeaderが0(空)になってるのが原因のようですね。
PostDataLengthとPostDataも初期化されてないので、これ以降もエラーになりそうです。

592行目を下記のように書き換えるとどうでしょう?

if (methodType = METHOD_GET) { ↓ if (methodType = METHOD_GET || methodType = METHOD_DELETE) {



SMOPU

リンク

2022/5/29(Sun) 18:27:51|NO.96503

>METHOD_DELETEの時に、RequestHeaderが0(空)になってるのが原因のようですね。
>PostDataLengthとPostDataも初期化されてないので、これ以降もエラーになりそうです。
なるほど、tcupのソースモジュールの方には、元々RequestHeaderがなかったんですね。

あと、画像付きウェルカムメッセージをやりたいのですが、失敗してしまいます。
動画付きウェルカムメッセージでもいけますよね?
何が原因でしょうか

#include "hsp3utf.as" #include "TsubuyakiSoup_mod_utf.hsp" #include "hspinet.as" //コンシューマーキー取得省略 ;Tweet "ツイートする文章を入力","リプライID(文字列)","画像/動画メディアID(文字列)" dim PtrRoot sdim wel_id quick = "" description = "" image = "画像.jpg" exist image if strsize ! -1 { media_upload image, length(image), mediaid }else{ mediaid = "" } SetWelcomeMessage "ウェルカムメッセージテスト",mediaid,quick,description response = getResponseBody() if stat = 200{ jsonopen PtrRoot,response jsongetobj PtrRoot,"welcome_message",PtrRoot jsongets wel_id,"id",PtrRoot jsonclose SendWelcomeMessage wel_id if stat = 200 : dialog "成功" }else{ dialog "失敗"+stat,1 } objmode 2 pos 0,0 _response = "##### HEADER ######\n"+getResponseHeader()+"\n##### BODY #####\n"+getResponseBody() mesbox _response,640,480,4 stop



こいる

リンク

2022/5/29(Sun) 23:59:03|NO.96506

まず、ただ「失敗した」ではなく、「どう失敗したのか」を知りましょう。
前の返信でも書きましたが、レスポンスにエラー内容が返っているはずです。

ちなみに、NO.96489で質問したConvertToUnicodeEscapeSequence命令について、意味の通る文で再度説明していただけないでしょうか?



SMOPU

リンク

2022/5/30(Mon) 08:30:00|NO.96508

おっとすいません。

#module #uselib "kernel32.dll" #func lstrlenW "lstrlenW" int #defcfunc ConvertToUnicodeEscapeSequence str p1 sdim text_utf16, strlen(p1) * 2 + 2 cnvstow text_utf16, p1 result="" repeat lstrlenW(varptr(text_utf16)) code = wpeek(text_utf16, cnt * 2) result += strf("\\u%04x", code) loop return result
で十分だったようです。
豆腐の文字が出てたようなので、修正する必要があると思いましたが…。

ちなみに、ウェルカムメッセージのエラー内容は、There was an error sending your message: Media attached to Welcome Messages must have been uploaded with 'shared' flag set to true.
ということなので、第5引数にsharedのフラグを指定してみたのですが、第5引数に1にしても、同じエラーが出ます。
どこにフラグを追加すればいいのでしょうか?
ググって調べてみたのですが、media関連のリファレンスにsharedフラグについて、どこにも載っていませんでした。

#define global media_upload(%1,%2,%3,%4=0,%5=0) media_upload_ %1,%2,%3,%4 #deffunc media_upload_ array p1 ,int p3,var p2, int hProgress,int shared logmes "media_upload" sdim rawtext,512 sdim p2,512 ;sdim picname,1024 sdim arguments, 1024 if shared :arguments(0) = "shared=true" repeat p3 exist p1(cnt) if strsize <= 0:return 1 if hProgress: sendmsg hProgress, $402, 0:wait 10 arguments(1) = "media="+p1(cnt) execRestApi "media/upload.json", arguments, METHOD_XMPOST, hProgress if (stat != 200) :return 2 //ステータスコードが失敗 rawtext = "["+getResponseBody()+"]" json_sel rawText p2 += json_val("[0].media_id_string") + "," json_unsel wait 10 loop p2 = strmid(p2, 0, strlen(p2)-1) return 0



SMOPU

リンク

2022/5/30(Mon) 08:37:23|NO.96509

おっと、defineのmedia_uploadの部分を書き換えるの忘れていました。

#define global media_upload(%1,%2,%3,%4=0,%5=0) media_upload_ %1,%2,%3,%4,%5
に変えてみましたが同様です。



SMOPU

リンク

2022/5/30(Mon) 20:18:35|NO.96513

dm sharedについて、調べてみたところ一応ここにありましたが、よく分かりません…。
https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/message-attachments/guides/attaching-media
どこにsharedを指定したらいいのかも分かりません…。
画像付きウェルカムメッセージもいけたら、このスレッドは解決にします。



SMOPU

リンク

2022/5/31(Tue) 08:18:04|NO.96520

これでもダメなんですかね?
tCup_mod_utf.hsp のソースを改造する必要あるんですかね…?
https://twitter.com/smopu_M/status/1531414009680781312



こいる

リンク

2022/5/31(Tue) 22:17:54|NO.96529

返信が遅くなりました。

NO.96513でも提示されているページに
> Note: Media for use with Direct Messages should be uploaded using the asynchronous chunked upload process described on this page.
と書いてあり、どうやらmedia_upload命令で行っている一回でアップロードする方法ではなく、video_upload命令で行っている複数回に分けてアップロードする方法を使う必要があるようです。


なので、video_upload命令を改造します。汎用性を考えると説明が長くなるため、ウェルカムメッセージ用の画像をアップロードする場合の変更点だけを書きます。命令の引数で分岐するか、それ用の別の命令を作るなどしてください。

1. 引数の media_type を image/png に
2. 引数の media_category を dm_image に
3. 引数に shared=true を追加

4. 下らへんにある下記コードの、11行目〜17行目を、3行目の wait 500 の前に移動

repeat wait 500 sdim arguments, 256 arguments(0) = "command=STATUS" arguments(2) = "media_id="+mediaID execRestApi "media/upload.json", arguments, METHOD_GET s = stat if ( (s/100) != 2 ):return 5 //ステータスの取得でエラー res = "["+getResponseBody()+"]" json_sel res state = json_val("[0].processing_info.state") percent = json_val("[0].processing_info.progress_percent") json_unsel if state != "pending" && state != "in_progress":break loop

手順4の解説:
あのコードは、media/upload.json (command=STATUSの引数) でスタータスを取得し、そのステータスをみてメディアの処理が終わるまで待機するコードです。スタータス取得は、media/upload.json (command=FINALIZE の引数) が返したレスポンスのJSONに"processing_info"キーが含まれている場合に行う必要があります (参照: https://developer.twitter.com/en/docs/twitter-api/v1/media/upload-media/api-reference/get-media-upload-status )。
しかし、前述した画像のアップロード方法だとレスポンスに"processing_info"キーが含まれていないため、ステータス取得が失敗してしまい、アップロードは完了しているのにも関わらず命令が 5 を返してしまいます。
なので、あのコードの11行目〜17行目にある「メディアの処理が終わったかの判定処理」を先に持ってくることにより、スタータス取得を実行せずにループを抜けさせています。


動画の場合は、前述の手順3の改造を行うだけで大丈夫です。



SMOPU

リンク

2022/6/3(Fri) 19:44:50|NO.96549

おお、ありがとうございます。
返信が非常に遅くなりすいません。

media_uploadで画像付きウェルカムメッセージができなかったんですね…。
video_uploadのソースを改造して、工夫する必要があったんですね…!
direct_messages/welcome_messages/rules/destroy.json

あと、ウェルカムメッセージを削除する際に、成功しているのにも関わらず、ステータスコードが204って出るのですが、これって仕様なんですかね…。

#deffunc GetWelcomeMessage sdim arguments arguments(0) = "" execRestApi "direct_messages/welcome_messages/list.json", arguments,METHOD_GET return stat #deffunc DeleteWelcomeMessage str id sdim arguments arguments(0) = "id="+id execRestApi "direct_messages/welcome_messages/destroy.json", arguments,METHOD_DELETE return stat //キー取得インクルード省略 dim PtrRoot sdim wel_id quick = "" description = "" GetWelcomeMessage response = getResponseBody() if stat = 200{ jsonopen PtrRoot,response jsongetobj PtrRoot,"welcome_messages",PtrRoot jsonnext PtrRoot,PtrRoot,2 jsongets wel_id,"id",PtrRoot jsonclose DeleteWelcomeMessage wel_id dialog "実行ステータス"+stat }else{ dialog "失敗"+stat,1 } objmode 2 pos 0,0 _response = "##### HEADER ######\n"+getResponseHeader()+"\n##### BODY #####\n"+getResponseBody() mesbox _response,640,480,4 stop
とりあえず、画像付きウェルカムメッセージも、動画付きウェルカムメッセージもできたようなので、解決にしておきます。



こいる

リンク

2022/6/3(Fri) 20:52:56|NO.96551

>ウェルカムメッセージを削除する際に、成功しているのにも関わらず、ステータスコードが204って出るのですが、これって仕様なんですかね…。
仕様です。HTTPステータスコードの200番台は「成功」を意味するらしく、200でなくとも202や204でも成功はしています。
「204」はNo Contentを意味し、「レスポンスのボディにコンテンツはない」ということだと思います。ただの削除なので、成功可否だけ分かれば十分ですからね。

なので、video_upload命令内では成功確認を下記のようにしていたりします。

// 成功 if ((stat/100) == 2)



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