【Opensea】NFTに無限に「いいね❤」押せるツールを作成した話



## Openseaが意外とガバガバだった話。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">[Opensea Hack] NFT Favorite Bot 2022✨<br><br>✅Everyday Everynight Getting More Likes on Your NFTs<br>Created by <a href="https://twitter.com/LostMyCode?ref_src=twsrc%5Etfw">@LostMyCode</a><a href="https://twitter.com/hashtag/NFTCommunity?src=hash&amp;ref_src=twsrc%5Etfw">#NFTCommunity</a> <a href="https://twitter.com/hashtag/opensea?src=hash&amp;ref_src=twsrc%5Etfw">#opensea</a> <a href="https://t.co/rSHHPvJZaM">pic.twitter.com/rSHHPvJZaM</a></p>&mdash; Synergy (@LostMyCode) <a href="https://twitter.com/LostMyCode/status/1544321499498430464?ref_src=twsrc%5Etfw">July 5, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


------

Openseaは世界最大級のNFTマーケットプレイスです。


# はじめに


[@LostMyCode](https://twitter.com/LostMyCode): 日々なんかhackできることないか探すのに勤しんでいます（謎精神）


なぜこんなものを作ったのか？

どんな意味があるのか？


そんな疑問もあるでしょうが、作ったのは「いいね」が欲しいからではないです。

ただ、そこにいいねを無限に増やせそうなOpenseaがあったからです。。。



## Openseaのいいね機能

Openseaは世界最大のNFTマーケットプレイスで、NFTごとに「いいね」を押せる機能があります。

そこで気づいたんですけど、Openseaってウォレットさえ用意すればアカウント作れるから**無限にアカウント作り放題**なんですね。

つまり、「いいね」も付け放題の状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576748/1cd1c17d-048a-471d-0b39-466a8b910d4b.png)


１日くらいほったらかしにしてたら１万８０００いいね付いてました（[証拠](https://opensea.io/assets/matic/0x2953399124f0cbb46d2cbacd8a89cf0599974963/18787915268332924190917742420012866093351266449183228028156090440355409821697)）


## 実現するまでの流れ

言語: node.js

おおまかな流れとしては

- ウォレットを作成
- Openseaのアカウント作成
- アカウントのAuthトークンを取得
- 「ターゲットのNFTにいいねをつける」メッセージを送信

までをプログラムで自動化する。


### ウォレット作成

イーサリアムのウォレットを作成します。

これはnode.jsなら `ethereumjs-wallet`とかを使えば可能です。

```javascript
const ethWallet = require("ethereumjs-wallet");

...


const privateKeyBuffer = Buffer.from(privateKey, "hex");
const wallet = ethWallet.default.fromPrivateKey(this.privateKeyBuffer);
const address = this.wallet.getAddressString();
```


### Openseaアカウントを作成

作成したウォレットを用いてOpenseaアカウントを作成します。

OpenseaのAPIに対して
`challengeLoginMessageQuery`というリクエストを自分のウォレットアドレスを添えて送るとメッセージが届きます。

以下のようなメッセージ（Metamaskで見たことある人も多いハズ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576748/6b3b4167-e636-f0ba-e9fd-a0d9fd33121e.png)

このメッセージに対して自分のウォレットで署名して送り返す必要があります。

### Authトークン取得

ウォレットでメッセージに署名してAPIに送ることでAuthトークンを取得することができます。

署名は node.jsですと、 `eth-sig-util` が使えます。

例

```javascript
const ethSigUtil = require("eth-sig-util");

...


// dataがメッセージstring
const signature = ethSigUtil.personalSign(privateKeyBuffer, { data });
```


これで署名を得られます。
これをOpenseaAPIに対して`authLoginMutation`でリクエストします。
送るのは　`自分のウォレットアドレス、受け取ったメッセージ、メッセージに対する署名`


するとAPIからtokenがレスポンスで返ってきます。

auth token
```
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiVlhObGNsUjVjR1U2TXpVMU5UWTJNams9IiwidXNlcm5hbWUiOiJTWU5LLXMxbXI4M2pkIiwiYWRkcmVzcyI6IjB4MDMyYzVmYWJmYzkxZDcyNTg1M2NlOGE2MTY5NDMxYTEzNDRmMDQxNiIsImlzcyI6Ik9wZW5TZWEiLCJleHAiOjE2NTczNzk0OTQsIm9yaWdJYXQiOjE2NTcyOTMwOTQsImFwaUFjY2VzcyI6Im5vbmUifQ.N82VH95yDa9V31PoHJw6nnFG7CVKkfMtpcOePTh7foo
```

### いいね付けたいNFTに「いいね」リクエスト送信

またまたAPIにリクエストを送ります。
今回はさきほど受け取ったAuth tokenをAuthorizationヘッダにセットします。

```
headers: { authorization: "JWT " + authToken }
```




いいねをつけるときは `useAssetFavoriteMutation`リクエストを送信します。

送るリクエスト内容は以下のようになっています。





```javascript
        let res = await OSP.requestAPI(
            {
                "id": "useAssetFavoriteMutation",
                "query": "mutation useAssetFavoriteMutation(\n  $asset: AssetRelayID!\n  $isFavorite: Boolean!\n) {\n  assets {\n    updateFavorite(asset: $asset, isFavorite: $isFavorite)\n  }\n}\n",
                "variables": {
                    "asset": assetId,
                    "isFavorite": true
                }
            },
            {
                headers: {
                    "authorization": "JWT " + authToken
                }
            }
        );
```


assetIdが対象のNFTのIDです。
このIDの取得方法は今回は省略します。
（簡単な説明：NFTのページにハードコードされているのでスクレイプするだけで大丈夫です）


### 一連の処理を無限ループ化

あとはwhileするなり、いいね押したい数だけforループするなりで好きなだけ「いいね」をNFTに押せるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576748/947e4e27-520f-26a7-6ac5-62c21c9fc025.png)
https://opensea.io/assets/matic/0x2953399124f0cbb46d2cbacd8a89cf0599974963/18787915268332924190917742420012866093351266449183228028156090440355409821697


## さいごに

いいね増やして「何の意味があるのか？」と思うかもしれませんが、
冒頭でもお話したように意味はないですし「いいね」が欲しいわけでもなく、ただそこにいいね押す機能があったからです。


ただ、あなたのNFTが普通の無名NFTより「なんでこんないいね付いてるんだ？」って**注目を集める**ことはできると思います。

### 追記：リリースしました

WEBサイトにアクセスするだけで誰でも使えます
[詳細はTwitterから御覧ください](https://twitter.com/LostMyCode/status/1559042589461860352)

https://twitter.com/LostMyCode/status/1559042589461860352


### 他のOpensea関連ツール紹介

------

NFTを無限にMintしてプレゼントするツール

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">[Behind] Takeover The Hidden Collections 😎<br><br>✅This script can fill someone&#39;s hidden collections with my NFTs <br>☠️ Your collections gonna be so dope ☠️<a href="https://twitter.com/hashtag/NFTCommunity?src=hash&amp;ref_src=twsrc%5Etfw">#NFTCommunity</a> <a href="https://twitter.com/hashtag/opensea?src=hash&amp;ref_src=twsrc%5Etfw">#opensea</a> <a href="https://t.co/GsegG64yq8">pic.twitter.com/GsegG64yq8</a></p>&mdash; Synergy (@LostMyCode) <a href="https://twitter.com/LostMyCode/status/1543600861045071872?ref_src=twsrc%5Etfw">July 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



------


【自動】手数料無料で数万人のユーザーにNFTを送るツール

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">[Behind] Auto Transfer Script Updated.<br>Now its possible to send over 1000 NFTs within a few hors (it never costs gas fee)😎<br><br>It may help creators who wanna hold <a href="https://twitter.com/hashtag/NFTGiveaway?src=hash&amp;ref_src=twsrc%5Etfw">#NFTGiveaway</a> event✨ <a href="https://t.co/Q05SSrVgDX">https://t.co/Q05SSrVgDX</a> <a href="https://t.co/yUPpOBjAyw">pic.twitter.com/yUPpOBjAyw</a></p>&mdash; Synergy (@LostMyCode) <a href="https://twitter.com/LostMyCode/status/1515703767655936009?ref_src=twsrc%5Etfw">April 17, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


------



Hacked by [@LostMyCode](https://twitter.com/LostMyCode)