Photo by RENATO CONTI on Pexels.com

TwitterとMastodonに同時配信するツールを作成

2023.07.08

Logging

おはようございます。先日、Twitter民がAPI制限で表示がされない問題が起きていた時に、TwitterとMastodonに同時配信するツールを作っていました。普通につぶやくのは前にコードを作っていましたので、それを流用して簡単に出来るなぁなどと思いながら作っていたら画像も添付した状態でつぶやきたいという欲が出てきて沼にハマりました。

Twitterの方は画像添付のつぶやきも簡単にできたものの、Mastodonで沼にハマりました。PHPにはcurlのメソッドがあります、これを使用してAPIに指示を出す感じです。ドキュメントにはヘッダーとともに必須項目を送信すればトゥート(つぶやける)できるよと記載されていたのだけど、実際はユーザーエージェントの値も送信しないと上手く動作しない仕様になっていました。

これはちょっと酷くない?と思いながら数時間悩み、その後、パラメーターの文字化けするという問題に沼にハマりここで数分悩んでいました。結局、全て自己解決したのですが調べても生成AIを頼っても答えが出ない場合は、今までの自分の知識や経験がある方が優位だなって感じました。

トイウコトデ、Qiitaでも掲載したのですがこちらでも解決策を記載します。

<?php
class Mastodon
{
    const host = "mstdn.jp";
    const endpoint1  = "/api/v1/statuses";
    const endpoint2  = "/api/v1/media";

    public function toot($text){
        $data = array('file' => new CURLFile("/var/www/html/t_m/image.png", 'image/png', "image.png"));
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://" . self::host . self::endpoint2);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: ' . $_SERVER['HTTP_USER_AGENT'], 'Content-Type: multipart/form-data', 'Authorization: Bearer ' . MSTDN_ACCESSTOKEN]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        $response =   json_decode(@curl_exec($ch));
        curl_close($ch);
        if (isset($response->id)) {
            $postdata = [
                "visibility" => "public",
                "media_ids" => [$response->id],
                "status" => strip_tags($text),
            ];
            $data = json_encode($postdata);
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, "https://" . self::host . self::endpoint1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_HTTPHEADER, ['User-Agent: ' . $_SERVER['HTTP_USER_AGENT'], 'Content-Type: application/json', 'Authorization: Bearer ' . MSTDN_ACCESSTOKEN]);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            $response =  @curl_exec($ch);
            curl_close($ch);
        }
    }
}

タグ

'User-Agent', API, application, array, Authorization, Bearer, Content-type, curl, false, isset, json_decode, mastodon, multipart, qiita, quot, Twitter, VERIFYHOST, トイウコトデ, トゥート, ユーザーエージェント,

PHPとVS2015をJSONで連携する。第二弾

2016.06.18

Logging


VB2015側

Imports System.Net
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim sTargetUrl As String = "http://zip358.com/tool/2015-12-01-smp/index.php"
        Dim objWeb As WebClient = New WebClient()
        Dim bResult As Byte() = objWeb.DownloadData(sTargetUrl)
        Dim sJson As String = System.Text.Encoding.UTF8.GetString(bResult)
        Dim json_obj As Object = JsonConvert.DeserializeObject(sJson)
        RichTextBox1.Text = json_obj("1")("id") & json_obj("1")("name")
    End Sub
End Class

PHP側

<?php
$hoge = array();
$a = 'jsonキタ━(゚∀゚)━!name';
for ($i = 1; $i < 100; $i++)$hoge[$i] = array("id"=>$i,"name"=>$a);
//echo $hoge[$i]["name"];}
header('Content-type: application/json;charset=UTF-8');
echo json_encode($hoge, JSON_UNESCAPED_UNICODE);

以前、PHPとVS2015をJSONで連携する。という記事を
掲載したと思いますが、第二弾として、配列化して取得する方法を
記載したいと思います。
今回使う吐き出し側は以前と変わっていませんが
取り出し側が以前と少し変わってStringで返ってきたjsonデータを
デシリアライズしてから、Objectに流し込んでます。
下記のような結果が得られます。(画像参照)

タグ

AM, Content-type, Dim bResult As Byte, Dim json_obj As Object, Dim objWeb As WebClient, Dim sJson As String, Dim sTargetUrl As String, e As EventArgs, echo json_encode, End Class, Handles Button1.Click, Imports System.Net, JsonConvert.DeserializeObject, New WebClient, objWeb.DownloadData, Private Sub Button1_Click, Public Class Form1, RichTextBox1.Text, sender As Object, System.Text.Encoding.UTF8.GetString, VS2015, デシリアライズ,

PHPとVS2015をJSONで連携する。

2015.12.02

Logging

Imports System.Net
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim sTargetUrl As String = "http://zip358.com/tool/2015-12-01-smp/index.php"
        Dim objWeb As WebClient = New WebClient()
        Dim bResult As Byte() = objWeb.DownloadData(sTargetUrl)
        Dim sJson As String = System.Text.Encoding.UTF8.GetString(bResult)
        RichTextBox1.Text = sJson
    End Sub
End Class
<?php
$hoge = array();
$a = 'jsonキタ━(゚∀゚)━!name';
for ($i = 1; $i < 100; $i++)$hoge[$i] = array("id"=>$i,"name"=>$a);
//echo $hoge[$i]["name"];}
header('Content-type: application/json;charset=UTF-8');
echo json_encode($hoge, JSON_UNESCAPED_UNICODE);

これで事足りる。ちなみにVB2015からMYSQLに接続する方法とかも有ります。
この頃、VS2015無料版で何かできないかと模索中です。
前回作ったメモった何やら結構ダウンロードしてくれてる
みたいで結構嬉しかったりするのですが・・・
開発に時間もかかってないあんな短いしょぼいアプリでも
使ってもらえるって事は自分が作ったものって
案外需要がないわけではないことが
分かったので、アンドロイドアプリも作るつもりです。
ちなみに折り返しまで作っているのですが
あとAndroidStudio2.0がそろそろリリースされそうなので
リリースされてから、バージョンアップ後、
開発とかしようかなとか考えています。
ちなみに、上記のコードは少しパックってます(´Д`)が!!
何か!?
ちなみにアセンブリをひとつ参照しないといけないので
ご注意をコレ>>system.web.Extensions を参照してくださいな!!
第二弾へ続く{配列化して取得する。}
 

タグ

, AM, AndroidStudio2.0, Content-type, Dim bResult As Byte, Dim objSrializer As JavaScriptSerializer, Dim objWeb As WebClient, Dim sJson As String, Dim sTargetUrl As String, e As EventArgs, Handles Button1.Click, Imports System.Net, Imports System.Text, Imports System.Web.Script.Serialization, New JavaScriptSerializer, New WebClient, objWeb.DownloadData, Private Sub Button1_Click, Public Class Form1, RichTextBox1.Text, sender As Object, System.Text.Encoding.UTF8.GetString, system.web.Extensions, Visual Studio 2015 Windows, VS2015,

#プログラムサンプル ブログパーツは検索して出てくるのでうっぷします。

2015.03.11

Logging


ブログパーツの簡素な仕組みをUPします。基本はこれだけです。基本はこれだけですけど応用すると少々面倒くさいのでそこら辺はご想像におまかせします。これを基にして正規に配布する状態にするには、サーバの負荷の事やセキュリティとかそういう事まで考えなくてはならないので少々面倒くさいです。特にIDを発行して配布する場合などは結構、コードを書かないといけないです。また、悪意のあるユーザーがサーバに負荷をかけれる要因にもなりますので、安易にブログパーツを提供するのはオススメできません。ちなみに自分のブログパーツ用のJSを貼り付けても動作はしません(ファイルがないので)。ただ、下記のサンプルコードを自分自身のサーバ上に設置し、設置したURL(任意のURL)をJSで呼び出すと動作し、それを配布することも可能です。
PHPファイル

<?php
header("Content-type: application/javascript");
$str = htmlspecialchars($_GET["hoge"]);
if($str!=""){
	echo "document.write($str);";
}else{
	echo "document.write('hoge!?');";
}
?>

JS貼付け用。

<script src="https://zip358.com/tool/sample-tool/sample-blogtool.php?hoge='こんにちは'" language="JavaScript" charset="utf-8"></script>

タグ

AM, charset, Content-type, document.write, echo, header, hoge, htmlspecialchars, javascript, JS貼付け用, script src, script&gt, STR, utf-8, これだけ, ご想像, サーバ, セキュリティ, そこら辺, プログラムサンプル ブログパーツ, 負荷,