ゆーじぇいブログ

ゆーじぇいブログ

プログラミングとか色々

ブログ移転のお知らせ

こんにちは!いつもこのブログをお読みいただきありがとうございます。

突然ですが、ブログを移転させていただきます!

Hugoという静的サイトジェネレータの流行もあり、自分でブログをつくりたいな!と思った次第です。

youj.work

移転先はこちらのブログになります。

最新記事はもちろん、このはてブロに投稿した記事も順次このブログに移します。

よろしくお願いします!

[Golang]ニコニコ動画のAPIを使ってみた!

f:id:jyouj:20181216184046p:plain

ニコニコ動画APIGolangで使ってDiscord Botを作ってみました!今回はニコニコ動画APIを紹介しようと思います。

ソースコードはこちら

github.com

APIにアクセス

ニコニコ動画のスナップショットAPIを使います。動画を検索したりできます。

https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search?q=[[検索したいワード]]&targets=title&fields=contentId,title,viewCounter&filters[viewCounter][gte]=1000&_sort=-viewCounter&_offset=0&_limit=3&_context=apiguide

このURLにアクセスします。パラメータは自由に無くしてくれても構いません。qtargets_sortは必須です。データを三つ、再生数の多い順に取得します。

Goで実装

それではGoでアクセスするコードを書いていきましょう。

Jsonから構造体を書いていきます。

type Niconico struct {
    Meta struct {
        Status     int    `json:"status"`
        TotalCount int    `json:"totalCount"`
        ID         string `json:"id"`
    } `json:"meta"`
    Data []struct {
        ContentID   string `json:"contentId"`
        Title       string `json:"title"`
        ViewCounter int    `json:"viewCounter"`
    } `json:"data"`
}

そして、次にmain()を書いていきます。

package main

import (
  "fmt"
  "encoding/json"
  "net/http"
  "io/ioutil"
)

func main() {
 url := "https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search?q={{ 検索キーワード}}&targets=title&fields=contentId,title,viewCounter&filters[viewCounter][gte]=1000&_sort=-viewCounter&_offset=0&_limit=3&_context=apiguide"
  fmt.Println(url)
  resp, _ := http.Get(url)
  defer resp.Body.Close()
  byteArray, _ := ioutil.ReadAll(resp.Body)

  fmt.Println(string(byteArray))

  jsonBytes := ([]byte)(byteArray)
  data := new(Niconico)

  if err := json.Unmarshal(jsonBytes, data); err != nil {
    fmt.Println("JSON Unmarshal error:", err)
    return
  }

  if len(data.Data) == 0 {
    No content
  } else {
    fmt.println("https://nico.ms/" + data.Data[0].ContentID)
  }

これで検索ワードの最も再生数の多い動画のURLを表示できるはずです。

easy!

何かあれば、じぇい👨‍💻 (@jyouj__) | Twitterに!

投げ銭も待ってまーす!-> jyouj__さんの投げ銭ビスケット募集中!

[Django]LINEシェアボタンに動的URLを実装する

f:id:jyouj:20181124164719j:plain

Djangoの動的URLをLINEシェアボタンで共有されるURLに反映してみましょう。

LINEシェア

投稿(Post)のidがURLとして共有されたいとします。

テンプレートには、

<a class="line button" href="http://line.me/R/msg/text/?投稿しました!https://example.com/{{ post.id }}/"><span><i class="fab fa-line"></i></span><span> LINE</span></a>

<style>
.line {
    background-color: #00B900;
  }
</style>

ボタンの整形にはBulmaを使ってます。FontAwesomeにLINEアイコンが追加されていて良かったです。

このようにURLのところに{{ post.id }}とそのまま埋め込んでおけば問題なくシェアされますね!Djangoを使っていなくても同じようにいけるはずです!

何かあれば、じぇい👨‍💻 (@jyouj__) | Twitterに!

投げ銭も待ってまーす!-> jyouj__さんの投げ銭ビスケット募集中!

[Django]uuidを使ってみる

f:id:jyouj:20181124164719j:plain

あけましておめでとうございます!

昨日、サービスをリリースしました!

Caroling

久しぶり(といっても一ヶ月ぐらい)にPython/Djangoを使ってサービスを作りました。

そこで、最近GolangやNuxt.jsの記事ばかりだったので、Djangoの記事を書こうと思います。

今回は、uuidをurlとして使ってみることについてです。

urlの値を簡単に推測されなくなります。

モデルの定義

models.pyに記述していきましょう。

from django.db import models
import uuid

# Create your models here.
class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    text = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.text

これでPostモデルのidがuuidになりました。

URLに

そして、urls.pyのpath()の一つ目の引数に

'<uuid:post_id>/'

これを書けばOKです。他のところは普通のpkとなんら変わりません!

何かあれば、じぇい👨‍💻 (@jyouj__) | Twitterに!

投げ銭も待ってまーす!-> jyouj__さんの投げ銭ビスケット募集中!

[Nuxt][Vue]Twitterライクな投票機能をvue-pollを使って実装!

f:id:jyouj:20181124165447p:plain

前回、Twitter風のカウンターを作ってみましたが、今度はTwitter風の投票機能を作ってみようと思います。

このパッケージを使います。

GitHub - ppietris/vue-poll: A Vue.js component for voting

Nuxt.jsを使っていますが、Vue.jsでも同じように行けます。

導入

npmでインストールしましょう。

$ npm install vue-poll

nuxt.config.jsにこう記述!

module.exports = {
  plugins: [
    { src: '~plugins/vue-poll.js', ssr: false }
  ],

最後にplugins/vue-poll.jsを作成しましょう。

import Vue from 'vue'
import VuePoll from 'vue-poll'

Vue.component('vue-poll', VuePoll)

これで準備は整いました。

実装

pages/index.vueを編集していきましょう。

<template>
  <section class="container">
      <div>
        <vue-poll v-bind="options" @addvote="addVote"/>
      </div>
  </section>
</template>

<script>
export default {
  data () {
    return {
      options: {
        question: "好きなプログラミング言語は?",
        answers: [
          { value: 1, text: 'Python', votes: 0 },
          { value: 2, text: 'Ruby', votes: 0 },
          { value: 3, text: 'PHP', votes: 0 },
          { value: 4, text: 'Java', votes: 0 }
        ]
      }
    }
  },
  methods: {
    addVote(obj) {
      console.log(obj.value + 'に投票したよ!')
    }
  }
}
</script>

npm run devを実行してみると! f:id:jyouj:20181230164654p:plain

Pythonに投票してみると!

f:id:jyouj:20181230164723p:plain

おお!Twitterの投票機能まんまだ!

何かあれば、じぇい👨‍💻 (@jyouj__) | Twitterに!

投げ銭も待ってまーす!-> jyouj__さんの投げ銭ビスケット募集中!