Mastodon을 Node.js에서 즐겨보세요

15443 단어 mastodonNode.js

Mastodon



왠지 화제가 되고 있는 Twitter 같은 서비스.
어제(2017-4-12) 근처부터 갑자기 화제가 되기 시작하고 있어, 자신도 조금 신경이 쓰였으므로 파오. 뿌리 tmstd 응. jp 에 계정을 작성했습니다.
또한 라이브러리도 풍부하고 Ruby/Python/JavaScript/Node.js/Elixir 버전이 공식 문서에 연결되어 있습니다.

Python으로 시도한 사람 가 이미 계셨기 때문에, 자신은 Node.js 로 Toot 할 때까지 해 보았습니다.

환경



macOS Sierra 10.12.4
Node.js v7.9.0

해보자



트윗하기 전에,
  • client_idclient_secret 얻기
  • 그것을 바탕으로 Authorization Url을 생성한다
  • 액세스하고 취득한 Authorization Code에서 Access Token을 생성한다.
  • 그것을 바탕으로 Toot

  • 라는 흐름을 밟습니다.
    하지만, 1~3 에 대해서는 Mastodon API Client Library - GitHub 의 example 로 일발이므로, 실질 2 스텝입니다.

    액세스 토큰 얻기



    먼저 위의 라이브러리
    npm install --save mastodon-api
    

    에서 설치.
    이 안에 있는 authorization.js 을 조금 만져 사용합니다. 디폴트라고 mastodon.social 에 향합니다만, .social 는 사람이 너무 많아 신규 등록을 정지하고 있어 게다가 .jp 는 여러 사정( 후술 )으로 잘 되지 않았기 때문에 .io 로부터 토큰 를 얻고 있습니다.

    auth.js
    const readline = require('readline')
    const Mastodon = require('./node_modules/mastodon-api/lib/mastodon.js')
    
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    })
    
    let clientId
    let clientSecret
    
    const baseUrl = 'https://mstdn.io'
    
    Mastodon.createOAuthApp(baseUrl + '/api/v1/apps', 'testapp', 'read write follow')
        .catch(err => console.error(err))
        .then((res) => {
            console.log('Please save \'id\', \'client_id\' and \'client_secret\' in your program and use it from now on!')
            console.log(res)
    
            clientId = res.client_id
            clientSecret = res.client_secret
    
            return Mastodon.getAuthorizationUrl(clientId, clientSecret, baseUrl)
        })
        .then(url => {
            console.log('This is the authorization URL. Open it in your browser and authorize with your account!')
            console.log(url)
            return new Promise((resolve) => {
                rl.question('Please enter the code from the website: ', code => {
                    resolve(code)
                    rl.close()
                })
            })
        })
        .then(code => Mastodon.getAccessToken(clientId, clientSecret, code, baseUrl))
        .catch(err => console.error(err))
        .then(accessToken => {
            console.log(`This is the access token. Save it!\n${accessToken}`)
    })
    

    실행하면,
    This is the authorization URL. Open it in your browser and authorize with your account!
    https://mstdn.io/oauth/authorize?redirect_uri=(略)
    Please enter the code from the website: 
    

    와 나오므로 액세스합니다.



    이 화면의 "AUTHORIZE"를 누르면 문자열이 나오므로 콘솔에 입력하면 액세스 토큰을 얻을 수 있습니다.

    Toot 하기 전에 타임라인을 가져오기



    node-mastodonnpm install --save mastodon 로 설치.

    timeline.js
    var Masto = require('mastodon')
    
    var M = new Masto({
        access_token: 'とーくん',
        timeout_ms: 60 * 1000,
        api_url: 'https://mstdn.io/api/v1/',
    })
    
    M.get('timelines/public', function(err, data, res) {
        if(!err)
            for (key in data)
                console.log(data[key].content.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, ''))
    })
    

    모두의 투트가 벨로벨로 나옵니다.
    덧붙여서 트트 본문은 전체가 p태그로 둘러싸여 있어 내용도 HTML 태그가 다채롭습니다. 조금 사용하기 어려울지도.

    Toot 시도



    toot.js
    var Masto = require('mastodon')
    
    var M = new Masto({
        access_token: 'とーくん',
        timeout_ms: 60 * 1000,
        api_url: 'https://mstdn.io/api/v1/',
    })
    
    M.post('statuses', {status: 'Test from myapp'}, function (err, data, res) {
        if (!err)
            console.log(res)
    })
    



    할 수 있었습니다.

    막힌 곳



    인증을 .jp 로 하려고 했습니다만, 이하의 에러를 토해서 할 수 없었습니다.
    { Error: Hostname/IP doesn't match certificate's altnames: "Host: mastodon.jp. is not in the cert's altnames: DNS:*.gmoserver.jp, DNS:gmoserver.jp"
        at Object.checkServerIdentity (tls.js:199:17)
        at TLSSocket.<anonymous> (_tls_wrap.js:1094:29)
        at emitNone (events.js:86:13)
        at TLSSocket.emit (events.js:188:7)
        at TLSSocket._finishInit (_tls_wrap.js:610:8)
        at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38)
      reason: 'Host: mastodon.jp. is not in the cert\'s altnames: DNS:*.gmoserver.jp, DNS:gmoserver.jp',
      host: 'mastodon.jp',
    

    분명히 요청하는 도메인과 인증서의 도메인이 다른 경우 토해지는 오류 인 것 같습니다. 증명서 체크를 무시하면 통과하는 것 같습니다만, 과연 무서워서 할 수 없어.
    라고 할까 .jp 라고 이름.com 사용하고 있군요.

    [2017-4-14 추가]
    도메인 이름을 착각했습니다 ......! 죄송합니다.
    올바른 도메인은 mstdn.jp입니다. 인증이 통과하는 것도 확인했습니다.

    여러 뉴스 사이트에서 화제가 된 탓에 유저가 대량으로 유입하고 있는 것 같고, 메일 서버도 펑크 직전(오늘(2017-4-13)의 16시경 등록했습니다만, 등록 확인 메일이 도착한다 까지 40분 걸렸습니다) 같기 때문에, 좀처럼 개인 레벨에서 인스턴스를 가지는 것은 힘들 것 같습니다.
    그렇다고는 해도 재미있는 서비스라고 생각하기 때문에, 앞으로 점점 발전해 주었으면 합니다.

    (혼자 행성처럼 되지는 않아……)

    [2017-4-19 추가]
    사쿠라 클라우드로 이전하여 바삭 바삭하게되었습니다! 앞으로가 기대됩니다.

    좋은 웹페이지 즐겨찾기