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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1127
アルファ研究所TwitterAPIでタイムラインを取得したい29解決


アルファ研究所

リンク

2021/11/27(Sat) 18:18:51|NO.94547

HSP3でTwitterAPIのTsubuyakiSoupを利用してタイムラインを取得することは可能でしょうか?
何か方法があればお願いします。



この記事に返信する


アルファ研究所

リンク

2021/11/27(Sat) 18:19:42|NO.94548

ググっても見つかりませんでした



リンク

2021/11/28(Sun) 15:05:40|NO.94554

僕からもお願いします。



とおりすがりの人

リンク

2021/11/28(Sun) 19:21:24|NO.94562

HSP3からTwitterに投稿したい
http://hsp.tv/play/pforum.php?mode=all&num=93135

これが参考になりませんか?



アルファ研究所

リンク

2021/11/29(Mon) 20:03:29|NO.94563

TwitterAPIでHSPからツイートする方法はわかるのですが、タイムラインを取得する方法がわかりません。
文字列は取得できないのでしょうか。



Crystal

リンク

2021/11/29(Mon) 21:06:53|NO.94565

おそらくですが、TsubuyakiSoupの対応しているのは、 Twitter API v1 で様々な制約があります。その一部にタイムラインの取得があったはずです。
現行の、Twitter API v2 ではそれらが利用可能になっているのですが、 TsubuyakiSoupではまだ対応されていないと考えます。ですので、対応を待つか、
ご自身で v2に対応するようにしてみてはどうでしょうか? (GitHubに上がっているので、ソースコードをDLできます)
Twitter API v1 と Twitter API v2 については、 Twitter 公式ヘルプにありますので参照してください。
(あくまで予想です。TsubuyakiSoup のソースをざっと見てタイムライン取得用のものがなかったのでverの違いかなと考えただけです)



アルファ研究所

リンク

2021/12/1(Wed) 20:55:05|NO.94582

実行してみたのですが、ツイートの文章がUnicodeエスケープシーケンスで表示されるのですが、Textの部分を取得して通常の文字列に変換できないのでしょうか。

#include "hsp3utf.as"
#include "TsubuyakiSoup_mod_utf.hsp"
#include "key.hsp"
#include "user32.as"

/*
===========================
このサンプルを実行するには予めkey.hspにTwitterから発行されるIDの登録が必要です
またgettoken.hspを実行しアクセストークンを取得する必要があります
============================
*/

#include "TsubuyakiSoup_Token.hsp"

getUserTimeline "alp_institute",2

if stat ! 200 :MessageBoxW hwnd,"ツイートの取得に失敗しました。"+stat,"ステータスエラー",16

screen 0,800,600
objmode 0
;notesel response
response = "##### HEADER ######\n"+getResponseHeader()+"##### BODY #####\n"+getResponseBody()
;notesave "tweet.log"
mesbox response,ginfo_winx,ginfo_winy,4


stop



zrs90(5さい)

リンク

2021/12/1(Wed) 21:44:15|NO.94584

大変申し訳ありません。

当方の、スマホ操作ミスで、5〜6件、連続投稿してしまい
削除しました。



zrs90(5さい)

リンク

2021/12/1(Wed) 22:31:55|NO.94585

追記。
ユニコードエスケープシーケンスの過去記事

http://hsp.tv/play/pforum.php?mode=all&num=93450



アルファ研究所

リンク

2021/12/8(Wed) 19:09:35|NO.94636

Unicodeエスケープシーケンスの変換はわかるのですが、textの部分だけ取得する方法はないですかね…?



zrs90(5さい)

リンク

2021/12/8(Wed) 21:57:10|NO.94641

申し訳ありません。私、Twitter自体やってないので
分かりませんが...。

ツイートの文章の中に、"text"が含まれているなら

1. ツイートの文章自体を、Unicodeエスケープシーケンス変換する

2. 1.を、note系命令を使って、"text"の部分だけ切り出す。
(※不要な部分を削除するか、必要な部分だけ取り出す)

...の処理では、ダメでしょうか?



アルファ研究所

リンク

2021/12/19(Sun) 08:26:00|NO.94723

jsonのtextのパラメーターを取得して、それを変換したいのですが…。



Crystal

リンク

2021/12/19(Sun) 11:35:40|NO.94724

>jsonのtextのパラメーターを取得して、それを変換したいのですが…。
hspinetにあるjson各命令にjsonのパラ取得→変換するといった命令が実装されていますので調べてみてください。
サンプルソースを書こうと思ったのですが、"text"タグが取得できず、0表記になってしまっていて困っています..



リンク

2021/12/19(Sun) 13:15:26|NO.94725

ありがとうございます



こいる

リンク

2021/12/19(Sun) 17:52:30|NO.94726

hspinetを使う場合は、こんな感じでできると思います。

#include "hspinet.as" (NO.94582のコード) // jsonをファイルから読み込み (任意jsonでのテスト用) /* sdim response notesel response noteload "example_response.json" //*/ // 全ツイートのtextをリスト化 // json読み込み dim jsonPtrRoot jsonopen jsonPtrRoot, response if (jsonPtrRoot == 0) : dialog "jsonの読み込みに失敗" : end // ツイートの階層へ移動 dim jsonPtrTweet jsonnext jsonPtrTweet, , 2 sdim tweetedText sdim tweetedTextList notesel tweetedTextList repeat // textタグを取得 jsongets tweetedText, "text", jsonPtrTweet // リストに追加 noteadd strf("%3d: \"%s\"", cnt + 1, tweetedText) // 次のツイートへ jsonnext jsonPtrTweet, jsonPtrTweet if (jsonPtrTweet == 0) : break loop jsonclose // 作成したリストを表示 mesbox tweetedTextList, ginfo_winx, ginfo_winy, 4

自分はTwitter APIの申請をしていない(サンプルの実行ができない)ので、公式に載っていた「Example Response」のjsonを対象に動作確認しました。
https://developer.twitter.com/en/docs/twitter-api/v1/tweets/timelines/api-reference/get-statuses-user_timeline

ただし、sourceタグ内にクォーテーションマークが付いており、それが構文エラー(VSCode、その他いくつかのソフトで確認)となってjsonの読み込みができなかったみたいなので、そのクォーテーションマークを削除しています。
ページの表記ミスかなにかだと思いたいのですが、実際のレスポンスでもこのクォーテーションマークが付いてしまっているかもしれません……(その場合「jsonの読み込みに失敗」というダイアログがでます)。



アルファ研究所

リンク

2022/5/7(Sat) 15:10:51|NO.96305

返信が遅くなりすいません。
やってみましたがエラーって出ます



こいる

リンク

2022/5/8(Sun) 11:32:59|NO.96311

おっと、NO.94582のコードだと変数responseにヘッダーも入ってるのですね。
変数responseに、getResponseBody()が返す値だけを入れてあげれば動くと思います。

また、Twitter APIの申請をして実際に動かしてみたのですが、jsongets命令辺りでUnicodeエスケープシーケンスが勝手に変換されるみたいですね。ただし、サロゲートペア(絵文字など)はうまく変換されないようです。


ちなみに、sourceタグ内のダブルクォーテーションによるエラーについて、実際に取得してみたところ、ダブルクォーテーションはしっかりエスケープされていてエラーは出ませんでした。公式サイトの表記がおかしいだけでしたね。



アルファ研究所

リンク

2022/5/8(Sun) 20:16:56|NO.96318

hsp3utfをインクルードしているのですが、(TwitterAPIがUTF-8の為)hsp3utfと併用はできるんですかね…?



こいる

リンク

2022/5/8(Sun) 22:05:01|NO.96319

んん、なにとhsp3utfを併用したいのでしょうか?

TsubuyakiSoupと併用ということでしたら、少しファイル名が違いますがこちらのinoviaさんの改変版を使っているのですよね?
https://github.com/inovia/TsubuyakiSoup_mod_u8
それでしたら「hsp3utfに対応。」と書いてあるので問題ないと思います。実際、特に動作に問題はありませんでした。


余談ですが、

#include "TsubuyakiSoup_Token.hsp"
とありますが、これはどこから入手したファイルなのでしょうか?

良く分からなかったので、サンプルの先頭にあった下記コードに置き換えたのですが、これを別ファイルにしているのでしょうか。

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



すもっぷ(アルファ研究所

リンク

2022/5/11(Wed) 22:49:21|NO.96339

そうですね
ちょっと面倒なので、これをインクルードしていて使っていました。

タイムラインの取得はいけたのですが、showStatusでツイートを取得したいのですが、失敗してしまいます。
なぜでしょうか?

#include "hsp3utf.as" #include "user32.as" #include "TsubuyakiSoup_mod_utf.hsp" #include "hspinet.as" dim jsonPtrRoot dim jsonPtrTweet sdim tweetedText sdim tweetedTextList CONSUMER_KEY = "" CONSUMER_SECRET = "" ACCESS_TOKEN = "" ACCESS_SECRET = "" font "meiryo",16 exist "keytoken.txt" if strsize < 0 : MessageBoxW 0,"実行する前に、TwitterAPI KEYを取得して、gettoken.exeを実行して、TOKENを取得してから実行してください。\nhttps://developer.twitter.com/en/apps からKEYを取得できます。","",48: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 = "" { MessageBoxW 0,"実行する前に、TwitterAPI KEYを取得して、gettoken.exeを実行して、TOKENを取得してから実行してください。\nhttps://developer.twitter.com/en/apps からKEYを取得できます。","",48 end } tCupInit "testClient", CONSUMER_KEY, CONSUMER_SECRET, 10 setAccessToken ACCESS_TOKEN, ACCESS_SECRET ;Tweet "ツイートする文章を入力","リプライID(文字列)","画像/動画メディアID(文字列)" showStatus "1524006268943228929" if stat = 200{ dialog "成功" }else{ dialog "失敗"+stat,1 } objmode 0 response = getResponseBody() jsonopen jsonPtrRoot, response if (jsonPtrRoot == 0) : dialog "jsonの読み込みに失敗" : end // ツイートの階層へ移動 jsonnext jsonPtrTweet, , 1 notesel tweetedTextList repeat // textタグを取得 jsongets tweetedText, "text", jsonPtrTweet // リストに追加 tweetedTextList += strf("%3d: %s\n", cnt + 1, tweetedText) // 次のツイートへ jsonnext jsonPtrTweet, jsonPtrTweet if (jsonPtrTweet == 0) : break loop jsonclose objmode 2 // 作成したリストを表示 mesbox tweetedTextList, ginfo_winx, ginfo_winy/2, 4 pos 0,ginfo_winy/2 mesbox response, ginfo_winx, ginfo_winy/2, 4 stop



すもっぷ(アルファ研究所

リンク

2022/5/11(Wed) 22:51:04|NO.96340




こいる

リンク

2022/5/12(Thu) 22:30:58|NO.96344

おそらく、レスポンスのjsonの形式が変わったからだと思います。

getUserTimelineによるタイムライン(複数ツイート)取得のjsonは、このように"created_at"や"id"などのキーと値が"{}"で括られているのが、"[]"内に複数ある形です。
ちなみに、この"{}"とその中身をオブジェクトと呼び、"[]"を配列と呼ぶようです。つまり、ツイートの情報を表すオブジェクトが配列になっています。

[ { "created_at": (略) }, { "created_at": (略) } ]

一方、showStatusによる単体ツイート取得のjsonは、このように"{}"(オブジェクト)単体です。

{ "created_at": (略) }

※取得したjsonはそのままでは見づらいですが、VSCodeなどで整形してあげると上記のjsonのように見やすくなります。



で、hspinetのjson系命令の使い方ですが、

1. jsonopenでjsonを開く
2. jsonnextで、オブジェクトを示すJSONポインタ値を取得
3. jsongetsやjsongetiで、JSONポインタ値から指定キー名の値を取得
4. jsoncloseでjsonを閉じる

といった感じです。

例としてNO.94726のコードでは、jsonopenが返してきたルート階層、つまり"[]"(配列)の階層を示すJSONポインタ値から、jsonnextで子階層のオブジェクト(ツイート情報を表すオブジェクト)を示すJSONポインタ値を取得し、そこからtextキーの値を取り出しています。
(ちなみに、コード内で「// textタグを取得」と書きましたが「// textキーの値を取得」の方が正しかったですね)


あえて具体的にどうすればいいかは書きませんが、HDLでhspinetのjson系命令の説明をよく読みNO.94726のコードを理解していただければ、どうすればいいかが分かるかと思います。



すもっぷ(アルファ研究所

リンク

2022/5/13(Fri) 20:32:19|NO.96351

ヘルプを見てみましたが、よく分からないです…。
jsonサンプルスクリプトも無いので、分からないのですが…。

jsonnextのヘルプにjson配列に関するものが載っていて、

jsonnext命令により、同じ階層にあるオブジェクトや、子階層(配列)内のオブジェクトを得ることができます。
と書いてあるので、
jsonnextのパラメーターだけ変えたほうがいいということなのでしょうか?



こいる

リンク

2022/5/14(Sat) 02:06:31|NO.96357

結論だけ言うと、ルート階層がすでにツイート情報のオブジェクトなので、そもそもjsonnextが要らないです。


ただし、json系命令の理解をしていただけると今後も役立つと思いますので、NO.94726のコードの説明を以下に書きました。
一度読んでいただけると理解の助けになるかもしれません。


▼1. まず、jsonopen命令で、引数2に渡したJSONを読み込ませます。読み込み後、引数1に渡した変数に、JSONのルート階層へのJSONポインタ値が代入されます。
・「ルート階層」とは、ルート(一番上)の配列・オブジェクトのことです。
・「JSONポインタ値」とは、これらjson系命令で使われる、配列・オブジェクトを示すIDのようなものです。
・「配列」とは"[]"(角括弧)のこと、「オブジェクト」は"{}"(波括弧)のことです(その配列やオブジェクトの中に、キー・値のペアがあります。配列にはオブジェクトも入れることが出来ます)。
・「キー」というのが"created_at"や"text"のようにあるもののこと、「値」がその後の": "に続けて書かれるもののことです(例:「"hoge": 1」だとhogeがキー、1が値)。

// json読み込み dim jsonPtrRoot jsonopen jsonPtrRoot, response

ルート階層は、このgetUserTimeline命令のレスポンスの場合、下記で「これ」と書いてあることのことです。

[ ←これ { "created_at": (略) }, { "created_at": (略) } ] ←これ


▼2. JSONの読み込みに失敗したらエラーを出して終了します。

if (jsonPtrRoot == 0) : dialog "jsonの読み込みに失敗" : end


▼3. jsonnext命令で、引数3に"2"を渡すことにより、ルート階層の「子階層にあるオブジェクト」のJSONポインタ値を、引数1に渡したjsonPtrTweet変数に代入してもらいます。

// ツイートの階層へ移動 dim jsonPtrTweet jsonnext jsonPtrTweet, , 2

つまり、配列の中にある最初のオブジェクトのことです。

[ { ←これ "created_at": (略) }, ←これ { "created_at": (略) } ]


▼4. tweetedText変数はtextキーの値を入れる一時変数、tweetedTextList変数はそれのリストです。notesel命令でリストへの行追加ができるようにします。

sdim tweetedText sdim tweetedTextList notesel tweetedTextList


▼5. ループ開始地点

repeat


▼6. (ループ内)jsongetobj命令で、引数3に渡したjsonPtrTweet変数(説明3で取得した。ツイート情報のオブジェクトを示す)に含まれる、"text"キーの値を、引数1に渡したtweetedText変数に代入してもらいます。

// textタグを取得 jsongets tweetedText, "text", jsonPtrTweet


▼7. (ループ内)noteadd命令で、notesel命令で選択しておいたtweetedTextList変数に、tweetedText変数(textキーの値)を番号付きで追加します。

// リストに追加 noteadd strf("%3d: \"%s\"", cnt + 1, tweetedText)


▼8. (ループ内)jsonnext命令で、引数2に渡したjsonPtrTweet変数の次のオブジェクトのJSONポインタ値を、引数1に渡したjsonPtrTweet変数に代入(同じ変数なので上書きの形になる)してもらいます。

// 次のツイートへ jsonnext jsonPtrTweet, jsonPtrTweet if (jsonPtrTweet == 0) : break

つまり、説明3の位置から、この位置に移動しています。

[ { "created_at": (略) }, { ←これ "created_at": (略) } ←これ ]

また、次のオブジェクトがなくなった、つまり全ツイートの情報を処理した場合にループを抜けます。


▼9. ループ終了地点

loop


▼10. JSONを閉じます。

jsonclose


▼11. tweetedTextList変数(textキーの値のリスト)をmesboxで表示します。

// 作成したリストを表示 mesbox tweetedTextList, ginfo_winx, ginfo_winy, 4


JSONの用語には詳しくないので、ルート階層・オブジェクト・配列の説明は調べた上で推論も込みで書いています。

ちなみに、前返信で「オブジェクト」のことを「この"{}"とその中身」と説明しましたが、それなら「配列」も中身を含めて配列と呼べましたね。
また、説明1では、JSONを見てイメージしやすいように「中身関係なしに"[]"自体を配列、"[]"自体をオブジェクトと呼ぶ」というように説明しました。



アルファ研究所SMOPU

リンク

2022/5/19(Thu) 18:19:14|NO.96395

こんな感じでいいのでしょうか?
文字が表示うなくされません。

//省略 showStatus "(ツイートのID)" if stat = 200{ dialog "成功" }else{ dialog "失敗"+stat,1 } response = getResponseBody() jsonopen jsonPtrRoot, response if (jsonPtrRoot == 0) : dialog "jsonの読み込みに失敗" : end // ツイートの階層へ移動 jsonnext jsonPtrTweet, ,1 jsongets tweetedText, "text", jsonPtrTweet jsonclose objmode 2 // 作成したリストを表示 pos 0,0 mesbox tweetedText, ginfo_winx, ginfo_winy/2, 4 pos 0,ginfo_winy/2 mesbox response, ginfo_winx, ginfo_winy/2, 4 stop



こいる

リンク

2022/5/20(Fri) 01:20:45|NO.96396

「ツイートが単一なのでtweetedTextList変数を介さなくても良い(tweetedTextを直接表示した)」というのは正しいです。
が、肝心なところが変わっていませんね。

NO.96357の解説は、コードの説明に重点を置きすぎて少し分かりづらかったですかね……。


以下に改めて要点をまとめました。

★注意として、なんとなく読み流すのではなく、1つ1つ理解しながら読み進めてください。
理解できないことがあった場合は、とりあえず読み飛ばしてもらっても構いませんが、何度か通して読み直してみてください。

そうすれば、自分はどこが理解できていて、どこが理解できていないのかが分かると思います。
その上で、理解できない箇所がある場合は「ここまでは分かったけど、ここからが分からない」というように質問していただけると、こちらも答えやすいです。

とにかく、分かること分からないことを整理してみましょう。



▼▼JSONについて▼▼

まず大前提として、JSONは [](角括弧)や {}(波括弧)が入れ子になっている、つまり「階層構造」になっています。

下記リンク先の画像は、Twitter最古のツイートと言われているツイート (https://twitter.com/Jack/status/20) のIDをshowStatus命令に渡し、getResponseBody命令が返したJSONです。

JSONの画像: https://imgur.com/a/N1FPDuA
↑全画面: https://i.imgur.com/Ra1R4g3.png
※さすがに分量のせいか投稿拒否されてしまったので画像にしています

{} の中にまた {} が入っていて、入れ子になっているのが分かるかと思います。


この {} を「オブジェクト」、[] となっているのを「配列」と呼びます。

で、"created_at"や"id"となってるのを「キー」、そのキーの後にある "Tue Mar 21 20:50:14 +0000 2006" や 20 を「値」と呼びます。
値は、HSPの構文と同じでダブルクォーテーションで囲まれてるのが文字列、数値だけなのは数値、HSPでは馴染みがないですがtrue/falseはboolean(bool値)、nullは無(つまりなにもないこと)を意味します。
また、値にオブジェクトや配列を使うこともできます。"entities"キーとその中身のような感じですね。

キーと値のペアを「メンバー」と呼びます。メンバー同士は ,(コンマ)で区切る必要があります。

ここまで大丈夫ですか?



▼▼hspinetのjson系命令について▼▼

json系命令は「JSONポインタ値」と呼ばれる数値で、配列・オブジェクトを識別するのですが……

【訂正】すみません。ずっと {}(とその中身)をオブジェクトとして扱ってきたのですが、どうやらこのjson系命令では「メンバー」もオブジェクトとして扱うようです。というか「配列」も「メンバー」も「オブジェクト」もひっくるめて「オブジェクト」と呼んでいるようです。
ただし、JSONの用語としては「▼▼JSONについて」で説明したのが正しいはずです。これらの命令が特殊なだけだと思うので、JSONの理解はそのままで大丈夫です。


つまり「JSONポインタ値」は、オブジェクトを識別する数値で、JSON用語で書くと 配列・オブジェクト・メンバーを識別する数値です。

なので、json系命令のドキュメントに書いてある「オブジェクト」とは「配列・オブジェクト・メンバー」のことだと思ってください。



▼▼本題▼▼

本題です。今回はコードを最初から見るのではなく、逆に辿ってみましょう。
NO.96395のアルファ研究所SMOPUさんのコードで説明します。


●1. jsongets命令
まず、このコードでツイートの内容である"text"キーの値が取得され、引数1のtweetedText変数に代入されてるのはわかりますよね?

jsongets tweetedText, "text", jsonPtrTweet

引数3のjsonPtrTweet変数には前述した「JSONポインタ値」が入っています。
jsongets命令は、これで示された配列・オブジェクト内にある、"text"キーの値を取得しているわけです。


●2. jsonnext命令
で「jsonPtrTweet変数が示している配列・オブジェクトはなにか」ということですが、この部分になります。

jsonnext jsonPtrTweet, ,1

はい、ではjsonnext命令のドキュメントを見てみましょう。
https://docs.hsp.moe/3.6/reference/hspinet/jsonnext/

引数1は「JSONポインタ値が代入される変数名」ということで、jsonPtrTweet変数にJSONポインタ値が代入されるようですね。

引数2は「JSONポインタ値」とありますが、このコードでは引数2になにも書いておらず、省略されています。
省略した場合ですが、こう書かれています。
> p2を省略またはマイナス値にするとjsonopen命令で読み込ませたデータのルート階層が使用されます。
「ルート階層」というのは、ルート(一番上)にある配列もしくはオブジェクトのことです。

引数3は「取得オプション」です。
「0 次のオブジェクト」や「1 前のオブジェクト」というのは、そのままの意味で、引数2に指定した配列・オブジェクト・メンバーの、次/前にある配列・オブジェクト・メンバーです。
「2 子階層のオブジェクト」というのは、前半の「■JSONについて」で説明した通りJSONは階層構造になっており、「子階層」というのは「中の」という意味です。つまり、中にある配列・オブジェクト・メンバーです。
例えば、上にあるJSONを例にすると、ルート階層の子階層は"created_at"と値の「メンバー」です。
「3 オブジェクトのtype値」というのは、オブジェクトの種類(配列・オブジェクト・メンバー{数値・文字列 など})を表す数値が取得されるのだと思います。


このコードだと引数3に 1 を渡しているので、ルート階層の前の配列・オブジェクト・メンバーを取得しようとしています。
しかし、ルート階層は一番上の配列・オブジェクトなので、前の配列・オブジェクトも、次の配列・オブジェクトも絶対に存在しません。ルート階層は常に1つなのです。

なので、jsonPtrTweet変数はなにも示していない(示すオブジェクトがない)ので 0 です。
存在しないオブジェクトから、jsongets命令で"text"キーの値を取得しようとしても、そもそもオブジェクトが存在しないのですからなにも取得できませんよね?


●3. ではどうすればいいのか
まずルート階層は具体的にどこのことなのか? というと、冒頭のJSONを例にすると"created_at"キーや"text"キーがある一番始めの {}(オブジェクト)のことです。

getUserTimeline命令で取得したJSONは、"text"キーを含むオブジェクトが配列になっていました(NO.96344を参照)。
その配列がルート階層だったわけです。
なので、jsonnext命令で子階層のオブジェクト("text"キーを含むオブジェクト)を取得する必要がありました。

しかし、今回は"text"キーを含むオブジェクトは配列になっておらず、"text"キーを含むオブジェクトがルート階層です。
つまり……?

ちなみに、NO.96357の返信の冒頭で、すでに答えは書いてあります。



アルファ研究所SMOPU

リンク

2022/5/21(Sat) 13:04:39|NO.96401

すいません。
自分の理解不足で申し訳ないです。
JSONを使うの初めてなので…。
>ちなみに、NO.96357の返信の冒頭で、すでに答えは書いてあります。
jsonnextは不要だったのですね…
失礼いたしました。

jsonopen jsonPtr, response if (jsonPtr == 0) : dialog "jsonの読み込みに失敗" : end jsongets tweetedText, "text", jsonPtr jsonclose
↑これに変えてみたら、取得はできたのですが、
userオブジェクト内のscreen_nameキーを取得する場合、jsonnextを使う必要があるのでしょうか?

{ "created_at": "id": "text": //省略 "user": { "id": "id_str": "name": "screen_name": ←ここの部分を取得したい } //省略 }
スクリプトはできれば載せなくてもいいので、具体的に1から順番に説明していただけると幸いです。



こいる

リンク

2022/5/21(Sat) 15:26:20|NO.96404

まずNO.96396の内容はどこまで理解できましたか?
なるべく分かりやすいように工夫したつもりなので、感想だけでもきかせていただけると嬉しいです。

とりあえず「JSONについて」と「hspinetのjson系命令について」が理解できている前提で話します。
以下の内容が理解出来ない場合は、NO.96396の内容を読み直してみてください。


>userオブジェクト内のscreen_nameキーを取得する場合、jsonnextを使う必要があるのでしょうか?

まず「JSONポインタ値」からは、直下の 配列・オブジェクト・メンバー しか参照できません。メンバーは、数値や文字列などの値は取得できますが、配列・オブジェクトの値の場合、その中身は参照不可です。
つまり、jsonopen命令が返したルート階層を示すJSONポインタ値からでは、その直下にある "created_at", "id", "text", "user" などのメンバーにしか触れず、"user"キーの値であるオブジェクトの中身までは参照できません。

なので、まず"user"メンバーのJSONポインタ値を取得する必要があります。
jsonnext命令でも取得できないことはないですがメンバーの順番に依存してしまうので、jsongetobj命令でメンバーのキー名を指定して直接取得します。

そうしたら、"text"キーの値を取得したときと同じように、jsongets命令で"screen_name"キーの値を取得してください。


ちなみに、こちらのページがかなり分かりやすかったので、読んでみると良いかもしれません。
https://hogespace.hatenablog.jp/entry/2012/03/18/121132



SMOPU

リンク

2022/5/22(Sun) 19:31:00|NO.96409

>まずNO.96396の内容はどこまで理解できましたか?
言葉だけでは、ちょっとわかりづらかったので、スクリプトを参考にして、やったらできましたwちょっと、文をよく読んでいなかったためですね…。
オブジェクトの単体で取得する場合は、jsonopenを呼び出してから、jsongetsでキーの文字列を取得して、jsoncloseで閉じる。
オブジェクト内のキーを取得するには、jsonopenを呼び出してから、jsongetobjでオブジェクトを取得して、jsongetsでキーの文字列を取得して、jsoncloseで閉じる。
ここまでは理解できました。
↓TsubuyakiSoup_mod_utf.hsp を見たら、新しいTwitterAPIの関数登録できそうなんですけど、ダイレクトメッセージの送信ってできないですかね…?
https://twitter.com/smopu_M/status/1528303979771203584
とりあえず解決にしておきます。
↓別のスレッドで()
https://hsp.tv/play/pforum.php?mode=all&num=95846



こいる

リンク

2022/5/23(Mon) 18:19:37|NO.96417

伝わってるようで良かったです。

DMの送信ですか……WebAPI自体ほとんど触ったことはありませんが、せっかくなのでこちらでも少し調べてみますね。



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