3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Qiita APIでQuine投稿(Node.js)

Last updated at Posted at 2019-07-31

TL;DR

この記事は、Qiita API v2 の記事作成APIを使用して作成し、この記事の最後に、この記事自体を作成するコードを記載しています。

はじめに

APIを使用して投稿した記事に、実際に投稿に使用したコードを記載したいと思いましたが、
下記のようにコードを直接記載すると、APIを使用するコード部分が再帰的になり、記載ができませんでした。

  item_create_request({
    title: 'hogehoge',
    body: `
# JavaScriptでHelloWorld

\`\`\`
console.log('HelloWorld');
\`\`\`

# 使用したコード

\`\`\` javascript
  item_create_request({
    title: 'hogehoge',
    body: \`
# JavaScriptでHelloWorld

\\\`\\\`\\\`
console.log('HelloWorld');
\\\`\\\`\\\`

# 使用したコード

(困った。個々の部分が再帰的になってしまい記載できない。)

\`\`\`

`
  })

つまり、**クワイン(プログラミング)**のような工夫が必要です。

この記事では、JavaScriptの関数はtoStringでソースコードの文字列を取得できることを利用して実現しました。

以下にNode.jsでのコード例を示します。

const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = (authorization_token) => {
  const item_title = '記事タイトル';
  const item_tags = [
    { name: 'タグ1' },
    { name: 'タグ2' },
  ];
  const item_body = `

★★ここに、記事本文を記載する★★

\`\`\`  javascript:myCode.js
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = ${thisCode.toString()}
thisCode(authorization_token);
\`\`\`

`;

  const request = require('request');
  request(
    {
      url: 'https://qiita.com/api/v2/items',
      method: 'POST',
      headers: { Authorization: authorization_token, 'Content-Type': 'application/json' },
      json: {
        private: false,
        title: item_title,
        tags: item_tags,
        body: item_body,
      },
    },
    (error, response, body) => console.log(error ? 'request fail' : 'request success')
  );
}
thisCode(authorization_token);

注意点

自身のAuthorizationのtokenを記事で晒すのは大変危険です。

上記コード例の先頭の「authorization_token」は実際は自身のtokenを記載して下さい(authorization_tokenは実際のコードと異なります)

2番目(コードエリアのauthorization_token)はもちろんダミーのままにして下さい

試すときのポイント

上記のコード例の、requestのjsonのprivateをtrueにすると、限定共有記事となり、気軽に試すことができます。

本記事もマークダウンでの表示を確認するために限定共有での投稿/削除を繰り返しました。

その他

evalを使った例や、他の言語の例もあると、Qiita APIの参考になるかも。

ちなみに、自動更新(記事更新)の例は自身のこちらの記事に載せてます。

この記事のAPIを実行したコード

\エスケープ地獄

myCode.js
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = (authorization_token) => {
  const item_title = 'Qiita APIでクワイン投稿(Node.js)';
  const item_tags = [
    { name: 'QiitaAPI' },
    { name: 'Node.js' },
    { name: 'JavaScript' },
    { name: 'quine' },
    { name: 'Quine投稿' },
  ];
  const item_body = `
# TL;DR

**この記事は、[Qiita API v2 の記事作成API](https://qiita.com/api/v2/docs#post-apiv2items)を使用して作成し、[この記事の最後](#この記事のapiを実行したコード)に、この記事自体を作成するコードを記載しています。**

# はじめに

APIを使用して投稿した記事に、**実際に投稿に使用したコード**を記載したいと思いましたが、
下記のようにコードを直接記載すると、**APIを使用するコード部分が再帰的になり**、記載ができませんでした。

\`\`\` javascript
  item_create_request({
    title: 'hogehoge',
    body: \`
# JavaScriptでHelloWorld

\\\`\\\`\\\`
console.log('HelloWorld');
\\\`\\\`\\\`

# 使用したコード

\\\`\\\`\\\` javascript
  item_create_request({
    title: 'hogehoge',
    body: \\\`
# JavaScriptでHelloWorld

\\\\\\\`\\\\\\\`\\\\\\\`
console.log('HelloWorld');
\\\\\\\`\\\\\\\`\\\\\\\`

# 使用したコード

(困った。個々の部分が再帰的になってしまい記載できない。)

\\\`\\\`\\\`

\`
  })

\`\`\`

つまり、**[クワイン(プログラミング)](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AF%E3%82%A4%E3%83%B3_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))**のような工夫が必要です。

この記事では、**JavaScriptの関数はtoStringでソースコードの文字列を取得できる**ことを利用して実現しました。

以下にNode.jsでのコード例を示します。

\`\`\` javascript
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = (authorization_token) => {
  const item_title = '記事タイトル';
  const item_tags = [
    { name: 'タグ1' },
    { name: 'タグ2' },
  ];
  const item_body = \`

★★ここに、記事本文を記載する★★

\\\`\\\`\\\`  javascript:myCode.js
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = \${thisCode.toString()}
thisCode(authorization_token);
\\\`\\\`\\\`

\`;

  const request = require('request');
  request(
    {
      url: 'https://qiita.com/api/v2/items',
      method: 'POST',
      headers: { Authorization: authorization_token, 'Content-Type': 'application/json' },
      json: {
        private: false,
        title: item_title,
        tags: item_tags,
        body: item_body,
      },
    },
    (error, response, body) => console.log(error ? 'request fail' : 'request success')
  );
}
thisCode(authorization_token);
\`\`\`

# 注意点

自身の**Authorizationのtokenを記事で晒すのは大変危険**です。

上記コード例の先頭の「authorization_token」は実際は自身のtokenを記載して下さい(authorization_tokenは実際のコードと異なります)

2番目(コードエリアのauthorization_token)はもちろんダミーのままにして下さい

# 試すときのポイント

上記のコード例の、requestのjsonのprivateをtrueにすると、限定共有記事となり、気軽に試すことができます。

~~本記事もマークダウンでの表示を確認するために限定共有での投稿/削除を繰り返しました。~~

# その他

evalを使った例や、他の言語の例もあると、Qiita APIの参考になるかも。

ちなみに、自動更新(記事更新)の例は自身の[こちらの記事](https://qiita.com/j5c8k6m8/items/1f23349c2521d916ed1a)に載せてます。

# この記事のAPIを実行したコード

~~\\エスケープ地獄~~

\`\`\`  javascript:myCode.js
const authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcd';
const thisCode = ${thisCode.toString()}
thisCode(authorization_token);
\`\`\`

`;

  const request = require('request');
  request(
    {
      url: 'https://qiita.com/api/v2/items',
      method: 'POST',
      headers: { Authorization: authorization_token, 'Content-Type': 'application/json' },
      json: {
        private: false,
        title: item_title,
        tags: item_tags,
        body: item_body,
      },
    },
    (error, response, body) => console.log(error ? 'request fail' : 'request success')
  );
}
thisCode(authorization_token);
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?