Skip to content

Instantly share code, notes, and snippets.

@Noxturnix
Created April 23, 2019 05:15
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Noxturnix/4872e22064e23143afe8a3514d396246 to your computer and use it in GitHub Desktop.
Save Noxturnix/4872e22064e23143afe8a3514d396246 to your computer and use it in GitHub Desktop.
import requests
url = input("YouTube URL: ")
filename = "commenters.txt"
#filename = input("Save to: ")
session = requests.Session()
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
"X-YouTube-Client-Name": "1",
"X-YouTube-Client-Version": "2.20190420"
}
resp = session.get(url, headers=headers)
xsrf_token = resp.text.split("XSRF_TOKEN\":\"")[1].split("\"")[0]
ctoken = resp.text.split("\"nextContinuationData\":{\"continuation\":\"")[1].split("\"")[0]
itct = resp.text.split("\"{}\",\"clickTrackingParams\":\"".format(ctoken))[1].split("\"")[0]
commenters = []
while True:
print("Scrolling. please wait... ({})".format(len(commenters)))
params = {
"action_get_comments": "1",
"pbj": "1",
"ctoken": ctoken,
"continuation": ctoken,
"itct": itct
}
data = {
"session_token": xsrf_token
}
resp = session.post("https://www.youtube.com/comment_service_ajax", params=params, headers=headers, data=data)
jsonResp = resp.json()
doBreak = False
if "continuationContents" in jsonResp["response"] and "continuations" in jsonResp["response"]["continuationContents"]["itemSectionContinuation"]:
ctoken = jsonResp["response"]["continuationContents"]["itemSectionContinuation"]["continuations"][0]["nextContinuationData"]["continuation"]
else:
doBreak = True
if "continuationContents" in jsonResp["response"] and "contents" in jsonResp["response"]["continuationContents"]["itemSectionContinuation"]:
for content in jsonResp["response"]["continuationContents"]["itemSectionContinuation"]["contents"]:
commenters.append(content["commentThreadRenderer"]["comment"]["commentRenderer"]["authorText"]["simpleText"])
if doBreak:
break
commenters = list(set(commenters))
open(filename, "w").write("\n".join(commenters).strip())
print("Warning: YouTube stopped sending a comment info. This means the script has fetch all comments correctly, or YouTube just blocked this script to fetch a comment just now.")
print("Saved {} name(s) (removed duplicates) to {}".format(len(commenters), filename))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment