Python
websocket
misskey

Websocketを使ってMisskeyでTwitterのStreamingAPIを擬似再現してみた

つい先ほどTwitterでStreamingAPIが廃止されました。

それに伴い、自分が使うようになったMisskeyでWebsocketを用いてAPIを色々叩いてみました。情報がまだ少ないので少しでも役に立てると幸いです。

下の方にサンプルコードもあるのでそこだけでもよければ。


開発環境

macOS mojave 10.14 beta

Python 2.7.10


今回の目標

コマンドライン常で自分のホームに流れてくるNoteをリアルタイムで取得、表示する。


準備


インストール

今回はWebsocketを使用して書いていきます。

必要なパッケージをインストールします。

pip install websocket-client


Token取得

今回は簡単にTokenを利用します。

このTokenというものはアカウントを不正利用される可能性があるので第三者に決して教えないようにしてください

Tokenの取得

[ホーム]→[右上の自分のアイコン]→[設定]→[API]


Token使用

Tokenはwss://misskey.xyz/?i=********の*******の部分に置き換えて使用します。


import

先ほどインストールしたものをインポートします。

import json

from websocket import create_connection


書いてみたコード(Sample Code)


main.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import json
from websocket import create_connection

hosturl = "wss://misskey.xyz/?i=***************"#***の部分にToken
ws = create_connection(hosturl)

while True:
content = json.loads(ws.recv())
body = content['body']
judge = body.get('renoteId', None)
if judge is None:
text = content['body']['text']
username = content['body']['user']['username']
id = content['body']['id']
sentence = username + u"「" + text + u"」"
print(sentence)
else judge is not None:
text = content['body']['renote']['text']
username = content['body']['renote']['user']['username']
sentence = u"Renote:" + username + u"「" + text + u"」"
print(sentence)


UserStreamの時のように綺麗に回す方法がわからなかったのでwhile True:で回してます。

RenoteとNoteを仕分けする部分でしばらく苦しみましたが、個人的には割と綺麗にまとまった感じです。もっと綺麗にできるとは思うんですがそこは誰かに投げます。

表示のされ方はこんな感じです。

スクリーンショット 2018-08-17 3.26.03.png

あとたまにエラーが出ます

追記:このコードくそだし欠陥まみれなので後日にでも書き直します。

使えないことはないので試しにどうぞ。


おまけ


取得できるもの一覧


note

Body(実際に取得したものを値に掲載しておりますのであくまで参考までにどうぞ)

Key

説明

media
[]
写真の有無

_renote
None

renoteId
None
renoteId

tags
[]
多分ハッシュタグ的なもの

text
string
投稿内容、本文

viaMobile
boolean
Misskeyを携帯で見ているか否か

userId
string
ユーザーのID(これは僕の)

visibleUserIds
[]
見ることが可能なユーザーのID(?)

visibility
string
公開範囲

next
None

geo
None
位置情報

mediaIds
[]

replyId
None
これがリプライだったらIDが出るはず

User

Key

説明

username
string
ユーザー名

isCat
boolean
猫かどうか

lastUsedAt
string

followersCount
int
フォロワー数

description
string
プロフィールの説明欄

avatarUrl
string
プロフアイコンURL

bannerUrl
string
バナーのURL

bannerColor
[R, G, B]
いろ

id
string
ユーザーID

host
None

createdAt
string
時間

followingCount
int
フォロー数

avatarColor
[]

pinnedNoteId
string

notesCount
int
Note数

name
string
ユーザー名


APIからNoteするサンプルコード

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import json
from websocket import create_connection

hosturl = "wss://misskey.xyz/?i=***************"
ws = create_connection(hosturl)

ws.send(json.dumps({
"type": "api",
"id": "sora114514",
"endpoint": "notes/create",
"data": {
"text": "text"#ここにNoteする文字
}
}))


自動でリアクションをする

リアクション一覧

import random

action = random.choice(['like', 'love', 'laugh', 'hmm', 'surprise', 'congrats', 'pudding'])
ws.send(json.dumps({
"type": "api",
"id": "114514114514",
"endpoint": "notes/reactions/create",
"data": {
"noteId": id,
"reaction": action
}
}))


まとめ

Streamingはリベンジします。

その他のサンプルコードはメモ程度に書いてたんですがどっかで役立てると嬉しい。

間違ってるとこあればコメントください。


リンク