在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):inox-ee/mstdn-app开源软件地址(OpenSource Url):https://github.com/inox-ee/mstdn-app开源编程语言(OpenSource Language):JavaScript 98.2%开源软件介绍(OpenSource Introduction):※このREADMEはブログと同一のものです Electron + ReactでMastodonクライアントを作るReactの勉強を始めて早1ヶ月。環境構築やAtomのクラッシュなどの困難を乗り越えた夏休み… ようやくElectronまでたどり着いたのでMastodonクライアントを作ってみた。 ソースコードは「いまどきのJSプログラマーのためのNode.jsとReactアプリケーション(クジラ飛行船, 2017)」を参考にしています 環境
まずはAPIを叩いてみるアプリの認証(本来は「認可」というべきらしい。)mastodon-apiを用いてMastodonのWeb API利用する。インスタンスは、Pixivが運営する https://pawoo.net にした。 このWeb APIはOAuth2という認証方法(*1)を行うため、以下の手順が必要。
正直mastodon-apiのライブラリがexampleファイルを用意してくれてるので適当にコピペすればおk。ということで割愛。 タイムラインの取得先ほどのアクセストークンを利用して以下のようなプログラムを書くと簡単にタイムラインを表示できる // MastodonのAPIクライアントの作成
const Mstdn = new Mastodon({
access_token: token,
timeout_ms: 60 * 1000,
api_url: instanceUri + '/api/v1/'
})
// タイムラインの読み込み
Mstdn.get('timelines/public', {})
.then(res => {
const data = res.data
console.log(data)
}) ちなみにtimelines/homeにすればホームタイムラインが、timelines/publicにすれば公開タイムラインが表示されます。 トゥートしてみるトゥートするのも簡単。そう、mastodon-apiならね。 // MastodonのAPIクライアントの作成
const Mstdn = new Mastodon({
access_token: token,
timeout_ms: 60 * 1000,
api_url: instanceUri + '/api/v1/'
})
// Toot
let message = process.argv[2]
Mstdn.post('statuses',
{status: message},
(err, data, res) => {
if (err) {
console.error(err)
return
}
}) 結論: アプリ成型構成構成はいたってシンプル。Electronを立ち上げ、アクティブになったらindex.htmlを読み込むだけ。 index.htmlからReactで書いたindex.jsxを呼んであげましょう。 Electronの立ち上げテンプレプログラムそのまま。ちなみに // Electron
let mainWindow
app.on('ready', createWindow)
app.on('window-all-closed', () => app.quit())
app.on('activate', () => {
if (mainWindow === null) createWindow()
})
// ウィンドウの作成
function createWindow () {
mainWindow = new BrowserWindow({width: 600, height: 800})
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}))
mainWindow.on('closed', function () {
mainWindow = null
})
} 表示するページElectronから呼ばれるindex.htmlですが、のちのちindex.jsxをwebpackでビルドしてあげるので メインコンポネント長すぎるので大幅に割愛してます。
まずはconstructor。 constructor(props) {
super(props)
this.apiUri = 'https://pawoo.net/api/v1/'
this.loadInfo()
this.state = {
tootdata: '',
timelines: []
}
}
そして次にコンポネントがマウントしたときの動作を書いたのですが、
書き終わってからeslintに指摘されて気が付きました。ググってもイマイチ理解できなかったので新しいライフサイクルがどのようになるのか誰か教えて~ ちなみにcomponentWillMount内ではタイムラインを読み込む
あと必要なのはトゥート処理。これも前項で紹介した
いよいよ描画。アプリの顔を作っていきましょう。 デザインにはあまり凝らなかったので、とりあえずトップに投稿フォーム、その下にタイムラインを表示するという構成に。以下のようにプログラムすれば十分でしょう。タイムライン表示の render () {
return (
<div>
<div>
<h1>Mastodon Client</h1>
<textarea
value={this.state.tootdata}
onChange={e => this.handleText(e)} />
<div>
<button onClick={e => this.tootFunc(e)}>Toot</button>
</div>
</div>
<div style={{marginTop: 120}}></div>
{this.renderTimelines()}
</div>
)
}
一番難しい、、、というか写経したあとなるほどな~って勉強してた() タイムラインを構築するコツはmapメソッドを使うところですかね。あと というわけでプログラム。 renderTimelines () {
const lines = this.state.timelines.map(e => {
console.log(e)
// when boosted
let memo = null
if (e.reblog) {
memo = (<p>{e.account.display_name}さんがブーストしました</p>)
e = e.reblog
}
// content every toot
return (
<div key={e.id}>
<img src={e.account.avatar} />
<div>{memo}{e.account.display_name}<span dangerouslySetInnerHTML={{__html: e.content}} /></div>
<div style={{clear: 'both'}} />
</div>
)
})
return (
<div>
<h2>TimeLines</h2>
{lines}
</div>
)
} むずかしいね
お好みで。 アプリの実行あとはwebpackでビルドして 以下のように立ち上がったら完成です。 参考サイト一覧API
OAuth2 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论