Статьи

Интерактивный взлом REST с помощью Sublime Text и RESTer

Вы когда-нибудь пропускали командную строку для веб-приложения? Если вам повезет, вы можете использовать REST API с соответствующими инструментами для той же работы.

В это Рождество я купил систему Sonos для нашей семьи. Это беспроводная акустическая система, которая использует сервисы потоковой передачи музыки. Он поддерживает и Spotify, и Deezer, но лучше работает с Deezer и поставляется с годовой бесплатной подпиской, так что Deezer это так.

Первый порядок бизнеса: импорт плейлистов Spotify в Deezer. Я нашел бесплатный сервис, который делает это, но пару раз случайно обновив браузер, мне удалось импортировать пять копий каждого плейлиста. Катастрофа!

Так начался мой квест: у меня было несколько случайно импортированных плейлистов в Deezer, и оказалось, что после удаления плейлиста мне понадобилось около пяти кликов, включая нажатие на маленькую иконку, чтобы удалить следующий. Это не собиралось быть веселым.

Как программист, вы знаете, что должен быть лучший способ. Возможно, этот лучший способ требует больше времени, потому что вам нужно что-то программировать, но, черт побери, лучше — лучше. В случае с Deezer я обнаружил, что у них хорошо документированный REST API. Но на этот раз мне не хотелось писать программу, чтобы решить эту проблему. Итак, мы добрались до сути этого поста: как вы можете просто выполнить довольно большое количество вызовов API, не написав для него программы? Все, что мне нужно было сделать, это выяснить, какой набор вызовов API нужно сделать на основе моего списка воспроизведения и выполнить их.

Мой текстовый редактор на сегодняшний день —  Sublime Text , в котором есть несколько плагинов. Rester плагин  был только то , что мне было нужно.

Итак, чтобы удалить лишние плейлисты:

  1. Я установил SublimeText 3, менеджер пакетов и RESTer
  2. Глядя на документацию по  Deezer API , я создал тестовое приложение и ввел URL: https://connect.deezer.com/oauth/auth.php?app_id=YOUR_APP_ID&redirect_uri=http://localhost&perms=basic_access,email,delete_library&response_type=token в веб-браузере. Это дало мне диалог авторизации с Deezer, который в итоге перенаправил на недопустимый URL на localhost. Тем не менее, URL будет что-то вроде  http://localhost/#access_token=xxxxxxxxxxxxxxxxxx&expires=3600. Просто скопируйте часть access_token, так как это понадобится позже.
  3. Теперь давайте перечислим плейлисты. В Sublime Text я пишу URL http://api.deezer.com/user/2529/playlists?access_token=xxxxx (замените идентификатор своим собственным идентификатором пользователя и access_token на результат последнего шага) и нажимаю ctrl-alt-r. Это выполняет вызов REST и возвращает результат в новом буфере в виде отформатированного текста JSON.
  4. В Sublime Text я вызываю диалог поиска с помощью ctrl-f, нажимаю кнопку «. *» (Регулярное выражение), ввод "title"|"picture" и нажимаю «Найти все». Это выбирает все соответствующие строки из ответа JSON.
  5. Теперь немного магии редактирования Sublime Text. Все строки с выхода выбраны. Нажмите shift-end, чтобы расширить выделение до конца их строк, ctrl-c, чтобы скопировать текст в буфер обмена, ctrl-a, чтобы выделить все, del для удаления и ctrl-v, чтобы вставить его.
  6. Вау! Это должно заменить текст набором чередующихся строк, таких как  "title": "something" и "picture": "something". Мы почти имеем то, что хотим. Дважды щелкните слово  "title" в любой строке и нажмите alt-f3. Это выбирает все места, где говорится  "title" в буфере. Нажмите end, чтобы перейти к концу строки, и del, чтобы соединить строку со следующей.
  7. Теперь каждый плейлист должен находиться на отдельной строке с заголовком и ссылкой на изображение. Нажмите F9, чтобы отсортировать строки. В моем примере я теперь ясно вижу все строки, которые являются дубликатами. Поэтому я удаляю строки, которые хочу сохранить, и сохраняю строки, которые хочу удалить. Для всех списков воспроизведения с дубликатами я удаляю одну строку в своем буфере, а оставшуюся оставляю для удаления.
  8. Теперь мне нужно создать команды удаления. Я дважды щелкаю на примере слова «картинка». Я нажимаю стрелку вправо, пока курсоры (несколько!) Не окажутся между ”и https-частью. Нажмите shift-home, чтобы выбрать все до,  https://api... и нажмите del, чтобы удалить это. Нажмите end, чтобы перейти к концу строки и возврату влево, пока вы не удалите часть «/ image», поэтому каждый URL будет выглядеть как « «.https://https://api.deezer.com/playlist/number
  9. Теперь у нас есть цели для удаления. В этот момент я пошел в начало буфера и нажимал стрелку ctrl-alt-down, пока у меня не появился курсор в начале всех строк. Я сейчас набираю « DELETE », нажимаю end, вставляю  access_token из шага 2 и жму enter. Теперь у меня есть все запросы, которые мне нужно выполнить, разделенные пустой строкой!
  10. Наконец, я перехожу к первой строке, нажимаю ctrl-alt-r, которая выполняет HTTP-запрос. Я нажимаю ctrl-w, чтобы закрыть ответ, иду вниз на две строки и нажимаю ctrl-alt-r, чтобы сделать это снова.

Это результат первого запроса:

{
  "data": [
    {
      "id": 160504851,
      "title": "- SKI -",
      "duration": 3128,
      "public": true,
      "is_loved_track": false,
      "collaborative": false,
      "rating": 0,
      "nb_tracks": 12,
      "link": "http://www.deezer.com/playlist/160504851",
      "picture": "https://api.deezer.com/playlist/160504851/image",
      "checksum": "541c0f5944b0081beca989e15b0b16dd",
      "tracklist": "https://api.deezer.com/playlist/160504851/tracks",
      "creator": {
        "id": 2529,
        "name": "dadbond",
        "tracklist": "https://api.deezer.com/user/2529/flow",
        "type": "user"
      },
      "type": "playlist"
    },
    {
      "id": 609456965,
      "title": "-- OLD Favourites --",
....

Вот как выглядит мой буфер после выбора заголовков и картинок и объединения строк:

"title": "01 - From radio","picture": "https://api.deezer.com/playlist/29070708/image",
"title": "01 - From radio","picture": "https://api.deezer.com/playlist/52354392/image",
"title": "01 - From radio","picture": "https://api.deezer.com/playlist/60934426/image",
"title": "01 - From radio","picture": "https://api.deezer.com/playlist/757807/image",
"title": "Alex Croiseaux - TOP TRACK","picture": "https://api.deezer.com/playlist/984435191/image",
"title": "All Good","picture": "https://api.deezer.com/playlist/38559351/image",
"title": "All Good","picture": "https://api.deezer.com/playlist/4341978/image",
"title": "All Good","picture": "https://api.deezer.com/playlist/51724984/image",
"title": "All Good","picture": "https://api.deezer.com/playlist/7068135/image",
"title": "Annif 2014","picture": "https://api.deezer.com/playlist/799155301/image",
"title": "Best Playlist EVER !!","picture": "https://api.deezer.com/playlist/30595446/image",
"title": "Best Playlist EVER !!","picture": "https://api.deezer.com/playlist/374755225/image",
"title": "Best Playlist EVER !!","picture": "https://api.deezer.com/playlist/55027024/image",
"title": "BOULOT","picture": "https://api.deezer.com/playlist/33136192/image",
"title": "daft punk - get Lucky.mp3","picture": "https://api.deezer.com/playlist/791327901/image",

Вот так мой буфер выглядел в конце.

DELETE https://api.deezer.com/playlist/52354392?access_token=abcde
 
DELETE https://api.deezer.com/playlist/60934426?access_token=abcde
 
DELETE https://api.deezer.com/playlist/757807?access_token=abcde
 
DELETE https://api.deezer.com/playlist/4341978?access_token=abcde
 
DELETE https://api.deezer.com/playlist/51724984?access_token=abcde
 
DELETE https://api.deezer.com/playlist/7068135?access_token=abcde
 
DELETE https://api.deezer.com/playlist/374755225?access_token=abcde
 
DELETE https://api.deezer.com/playlist/55027024?access_token=abcde

Иногда выполнение ежедневных рождественских заданий, таких как удаление большого количества списков воспроизведения, затруднительно с доступными программами. К счастью, имея немного знаний в области программирования и некоторые острые инструменты, вы можете выполнить работу через API.