X(旧Twitter)とthreadsとblueskyに同時投稿するツールを考える③
前回のあらすじ
blueskyは公式で便利なPythonモジュールを用意してくれているけどHTMLでは使えないのだった。javascriptは面倒い
前回貼り付けた記事。
で、これを織り込んだHTMLが以下。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
<script defer src="https://pyscript.net/latest/pyscript.js"></script>
<style type="text/css">
input[type="text"] {
width: 500px;
height: 100px;
}
</style>
</head>
<body>
<py-config>
packages = ["requests"]
</py-config>
<table>
<tr>
<th>SNS</th>
<th>post</th>
<th>ID</th>
<th>Password</th>
</tr>
<tr>
<th>Bluesky</th>
<th><Input type='checkbox' id='-bsky-'><label></label></th>
<th><Input type="Input" id="-bsky_id-" placeholder="ID(xxx.bsky.social)" autocomplete="on" size="15"></th>
<th><Input type="Input" id="-bsky_pass-" placeholder="パスワード" autocomplete="on"></th>
</tr>
</table>
Post
</br>
<textarea type="text" id="-post-" placeholder="ここに文章を入力" rows="5" cols="57"></textarea>
</br>
<button py-click="clicked()" id="-button-" style="border:2px solid #87a2c1; background-color:#cce3ff;">
<font color="#333333">-Bsky Post-</button>
</br>
<div id="text_log">ここにはログが表示されます</div>
<py-script>
import requests
import json
from datetime import datetime, timezone
import urllib.parse
from js import document
def clicked():
# Blueskyの情報取得
check_bsky = js.document.getElementById("-bsky-")
# Element("text_log").write(check_bsky.checked)
if check_bsky.checked == True:
if Element("-bsky_id-").element.value != "":
bsky_id_no = Element("-bsky_id-").element.value
bsky_password = Element("-bsky_pass-").element.value
else:
Element("text_log").write("BlueskyのIDを入力してください")
return
# 時刻の取得
utc_now = datetime.utcnow()
now = utc_now.strftime("%Y-%m-%dT%H:%M:%SZ")
# 投稿文の取得
text = Element("-post-").element.value
# 投稿フロー
# bluesky
if check_bsky.checked == True:
# ログイン
bsky_url = "https://bsky.social/xrpc/com.atproto.server.createSession"
bsky_data = {
"identifier": bsky_id_no,
"password": bsky_password
}
bsky_headers = {
"Content-Type": "application/json; charset=UTF-8"
}
response = requests.post(bsky_url, data=json.dumps(bsky_data), headers=bsky_headers)
accessJwt = response.json()["accessJwt"]
did = response.json()["did"]
# 投稿
url_post = "https://bsky.social/xrpc/com.atproto.repo.createRecord"
data_post = {
"repo": did,
"collection": "app.bsky.feed.post",
"record": {
"text": text,
"createdAt": now
}
}
headers_post = {
"Authorization": f"Bearer {accessJwt}",
"Content-Type": "application/json; charset=UTF-8"
}
response_post = requests.post(url_post, json=data_post, headers=headers_post)
responseJSON = response_post.json()
# ステータスコードが200か判定
if response_post.status_code == requests.codes.ok:
Element("text_log").write('blueskyにポスト完了')
else:
Element("text_log").write('blueskyのポスト失敗')
else:
# Element("text_log").write('bluesky no check')
pass
</py-script>
</body>
</html>
長い長い。
Noteってコードの折り畳みとか出来るん?埋め込み限定ならいいや。
取り敢えず出来たサイトが以下。(Googleサイトで作成)
パスワードとか入力するのアレかもしれないけど、
特にコードも隠していないので記録とかしてないのは見れると思う。
むしろコメント欄にスクリプト打たれたらどうなるとか逆に確認してない。
流石にAPI側で何とかしているのだろうか。
あとGoogleサイトで作成したせいか、スマホで見るとめっちゃ見難い。
でも出来たということで、
今度はTwitterの方を何とかしてみたいと思っている。