Soundcloud API / stream endpoint ให้ข้อผิดพลาด 401


13

ฉันพยายามเขียนแอปที่ตอบสนองพื้นเมืองซึ่งจะสตรีมเพลงจาก Soundcloud เป็นการทดสอบฉันเล่นกับ API โดยใช้ python และฉันสามารถขอแก้ไข URL ดึงเพลย์ลิสต์ / แทร็กและทุกอย่างที่ฉันต้องการ

ด้วยที่กล่าวว่าเมื่อทำการร้องขอไปยัง stream_url ของแทร็กใดก็ตามที่ฉันได้รับข้อผิดพลาด 401

URL ปัจจุบันที่เป็นปัญหาคือ: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

ฉันได้ลองแล้วโดยไม่มี? client_id ... ฉันลองแทนที่แล้วหรือยัง ด้วย &, ฉันลองรับ client_id อีกครั้งฉันลองใช้ allow_redirects ทั้งจริงและเท็จ แต่ดูเหมือนว่าจะไม่ทำงาน ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.

คุณสมบัติที่สามารถสตรีมได้ของทุกเพลงคือ True ดังนั้นจึงไม่ควรเป็นปัญหาสิทธิ์

แก้ไข:

หลังจากทำการวิจัยเล็กน้อยฉันพบวิธีแก้ปัญหาแบบกึ่งสำเร็จ ปลายทาง / stream ของ API ยังคงไม่ทำงาน แต่ถ้าคุณเปลี่ยนปลายทางปลายทางเป็นhttp://feeds.soundcloud.com/users/soundcloud : ผู้ใช้: /sounds.rss มันจะให้ฟีด RSS แก่คุณ (ส่วนใหญ่) เหมือนกับสิ่งที่คุณจะได้รับโดยใช้จุดสิ้นสุดแทร็กหรือเพลย์ลิสต์ API

ลิงค์ที่อยู่ในนั้นสามารถสตรีมได้


1
ฉันใช้ API มาระยะหนึ่งแล้วฉันก็ได้รับข้อผิดพลาด 401 เมื่อเร็ว ๆ นี้ไม่ใช่เพียงคุณ
r3verse

ในกรณีของฉันด้วย JavaScript API ไม่ทำงานสองสามวันแล้ว
Daniel

แอพทั้งหมดที่ฉันใช้ที่กด soundcloud API ได้หยุดทำงานไปหลายสัปดาห์แล้ว ดูเหมือนว่า SoundCloud จะมีการพัฒนาของบุคคลที่สามที่ถูกทอดทิ้งซึ่งแย่จริงๆ
oriyentel

คำตอบ:


7

โอเคฉันคิดว่าฉันได้พบวิธีแก้ปัญหาทั่วไปที่จะได้ผลกับคนส่วนใหญ่ ฉันหวังว่ามันจะง่ายขึ้น แต่มันเป็นสิ่งที่ง่ายที่สุดที่ฉันพบ

  1. ใช้ API เพื่อดึงเพลงจากผู้ใช้ คุณสามารถใช้ linked_partitioning และคุณสมบัติ next_href เพื่อรวบรวมทุกอย่างเนื่องจากมีการ จำกัด สูงสุด 200 แทร็กต่อการโทรหนึ่งครั้ง

  2. การใช้ข้อมูลที่ดึงลงมาใน JSON คุณสามารถใช้คีย์ permalink_url เพื่อรับสิ่งเดียวกันกับที่คุณพิมพ์ลงในเบราว์เซอร์

  3. ทำการร้องขอไปยัง permalink_url และเข้าถึง HTML คุณจะต้องทำการแยกวิเคราะห์ แต่ URL ที่คุณต้องการจะมีผลกับ:

    " https://api-v2.soundcloud.com/media/soundcloud:tracks:488625309/c0d9b93d-4a34-4ccf-8e16-7a87cfaa9f79/ สตรีม / โปรเกรสซีฟ "

    คุณอาจใช้ regex เพื่อแยกสิ่งนี้ออกง่าย ๆ

  4. ส่งคำขอไปยัง url นี้หรือไม่ client_id = ... และมันจะให้ URL อื่น ๆ แก่คุณในรูปแบบ json

  5. เมื่อใช้ url ที่ส่งคืนจากขั้นตอนก่อนหน้าคุณสามารถเชื่อมโยงโดยตรงไปยังที่อยู่ในเบราว์เซอร์และจะนำคุณไปยังเนื้อหาแทร็กของคุณ ฉันตรวจสอบ VLC โดยใส่ลิงค์แล้วสตรีมอย่างถูกต้อง

หวังว่านี่จะช่วยคุณในการพัฒนา


1
คุณเคยพิจารณาใช้ v2 api บ้างไหม? ดูเหมือนว่าพวกเขามีลิงก์api-v2.soundcloud.com/tracks?id=<song_id>&client_id=ที่พวกเขาใช้
user208685

นี่เป็นการตัดสินใจที่ดี แต่เมื่อคุณได้รับ URL สตรีมโดยตรงและพยายามเล่น SoundCloud play counter จะนับการเล่นนี้
อเล็กซ์

6

เนื่องจากฉันมีปัญหาเดียวกันคำตอบจาก @Default ทำให้ฉันต้องหาทางออก แต่ฉันไม่เข้าใจวิธีแก้ปัญหาด้วยpermalink_url ในขั้นตอนที่ 2 และ 3 วิธีแก้ปัญหาที่ง่ายกว่าอาจเป็น:

  1. ดึงตัวอย่างผู้ใช้แทร็กที่ชอบใช้api-v2จุดสิ้นสุดเช่นนี้:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. ในการตอบกลับเราสามารถค้นหา URL ที่ต้องการเช่นที่กล่าวถึงจาก @Default ในคำตอบของเขา:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. ทำการร้องขอไปยัง URL นี้โดยclient_idใช้เป็นพารามิเตอร์การสืบค้นและคุณจะได้รับ URL อื่นที่คุณสามารถสตรีม / ดาวน์โหลดแทร็ก

โปรดทราบว่าapi-v2ยังไม่เปิดเผยต่อสาธารณะและคำขอจากลูกค้าของคุณอาจถูกบล็อกโดย CORS


3
แทร็กจากผู้ใช้คือ: / users / <user_id> / track ชอบจากผู้ใช้คือ: / users / <user_id> / track_likes เพียงแทร็กเดียวคือ: / tracks / <track_id>
r3verse

@ r3verse ถูกต้องแก้ไขคำตอบของฉัน แต่การเป็นตัวแทนแทร็คควรเหมือนกันสำหรับจุดสิ้นสุดที่แตกต่างกัน
Serg

ใช่เกือบ @Serg สำหรับแทร็กเดียวคุณไม่มีวัตถุคอลเลกชันซ้อนกัน แต่การแสดงแทร็กนั้นเหมือนกัน ดีมากทั้งสองทาง
r3verse

5

ตามที่กล่าวถึงโดย@ user208685วิธีแก้ปัญหาอาจง่ายขึ้นเล็กน้อยโดยใช้ SoundCloud API v2:

  1. รับรหัสการติดตาม (เช่นใช้ API สาธารณะที่https://developers.soundcloud.com/docs )
  2. รับ JSON จากhttps://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. จาก JSON แยกวิเคราะห์ URL สตรีมแบบก้าวหน้า MP3
  4. จาก URL สตรีมรับ URL ไฟล์ MP3
  5. เล่นสื่อจาก URL ไฟล์ MP3

หมายเหตุ : ลิงค์นี้ใช้ได้เฉพาะในระยะเวลาที่ จำกัด และสามารถสร้างใหม่ได้โดยทำซ้ำขั้นตอนที่ 3 ถึง 5

ตัวอย่างในnode(กับnode-fetch):

const clientId = 'YOUR_CLIENT_ID';

(async () => {
  let response = await fetch(`https://api.soundcloud.com/resolve?url=https://soundcloud.com/d-o-lestrade/gabriel-ananda-maceo-plex-solitary-daze-original-mix&client_id=${clientId}`);
  const track = await response.json();
  const trackId = track.id;

  response = await fetch(`https://api-v2.soundcloud.com/tracks/${trackId}?client_id=${clientId}`);
  const trackV2 = await response.json();
  const streamUrl = trackV2.media.transcodings.filter(
    transcoding => transcoding.format.protocol === 'progressive'
  )[0].url;

  response = await fetch(`${streamUrl}?client_id=${clientId}`);
  const stream = await response.json();
  const mp3Url = stream.url;

  console.log(mp3Url);
})();

สำหรับวิธีแก้ปัญหาที่คล้ายกันใน Python ให้ตรวจสอบปัญหา GitHub นี้: https://github.com/soundcloud/soundcloud-python/issues/87

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.