エラー出力のある nico.rb 、 session.rb


 nFinder 起動時に何らかの原因でページ取得に失敗しましたとログイン画面が出るのと、error.txt にエラーが出るが原因不明なので、相談の為に nico.rb と session.rb を公開します。

error.txt#

--------------------------------------------------
no implicit conversion of Hash into String
./nico.rb:23:in `initialize'
./nico.rb:23:in `open'
./nico.rb:23:in `<main>'
--------------------------------------------------

nico.rb#

--------------------------------------------------
# encoding: CP932

require 'rubygems'
require 'open-uri'
require 'net/http'
require 'nokogiri'
require 'json'
require 'cgi'
require 'kconv'

result = 0

begin

target = ARGV[0]
cookie = ARGV[1].sub("watch_flash=1;", "watch_flash=0;").sub("watch_html5=0;", "watch_html5=1;")
flv_param = ARGV[2]
video_id = target.sub("http://flapi.nicovideo.jp/api/getflv/", "").sub(/\?.+/, "")
nico_url = "https://www.nicovideo.jp/watch/" + video_id

nico_url = "https://www.nicovideo.jp/my" if target.end_with?("getflv/sm9")

html = open(nico_url, {
"Pragma" => "no-cache",
"DNT" => "1",
"Accept-Encoding" => "deflate",
"Accept-Language" => "ja,en-US;q=0.8,en;q=0.6",
"Upgrade-Insecure-Requests" => "1",
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Cache-Control" => "no-cache",
"Connection" => "keep-alive",
"Cookie" => cookie
})

document = Nokogiri::HTML.parse(html.read)
if target.end_with?("getflv/sm9")
api_data = (document/"#CommonHeader")[0].attribute("data-common-header").value
json = JSON.parse(api_data)
flv_form = {
"user_id" => json["initConfig"].to_h["user"].to_h["id"],
"is_premium" => json["initConfig"].to_h["user"].to_h["isPremium"] ? 1 : 0,
"nickname" => json["initConfig"].to_h["user"].to_h["nickname"],
"time" => Time.now.strftime("%s%L"),
"done" => true,
}.delete_if {|k,v| v == "" || v.nil?}
puts URI.encode_www_form(flv_form)
puts video_id
puts ""
puts ""
exit(0)
end
dom_api_data = (document/"#js-initial-watch-data")[0]
api_data = dom_api_data.attribute("data-api-data").value
json = JSON.parse(api_data)
dmc_info = json["video"]["dmcInfo"]["session_api"]

exit(1) if json["media"].nil?
exit(1) if json["media"]["delivery"].nil?
dmc_info = json["media"]["delivery"]

req_body =
{"session":{"recipe_id":dmc_info["recipeId"],
"content_id":dmc_info["movie"]["contentId"],
"content_type":"movie",
"content_src_id_sets":[{"content_src_ids":[{"src_id_to_mux":{
"video_src_ids":dmc_info["movie"]["session"]["videos"],
"audio_src_ids":dmc_info["movie"]["session"]["audios"]}}]}],
"timing_constraint":"unlimited",
"keep_method":{"heartbeat":{"lifetime":dmc_info["movie"]["session"]["heartbeatLifetime"]}},
"protocol":{"name":"http",
"parameters":{"http_parameters":{"parameters":{"http_output_download_parameters":{"use_well_known_port":"no",
"use_ssl":"no"}}}}},
"content_uri":"",
"session_operation_auth":{"session_operation_auth_by_signature":{
"token":dmc_info["movie"]["session"]["token"],
"signature":dmc_info["movie"]["session"]["signature"]}},
"content_auth":{"auth_type":dmc_info["movie"]["session"]["authTypes"]["http"],
"content_key_timeout":dmc_info["movie"]["session"]["contentKeyTimeout"],
"service_id":"nicovideo",
"service_user_id":dmc_info["movie"]["session"]["serviceUserId"]},
"client_info":{"player_id":dmc_info["movie"]["session"]["playerId"]},
"priority":dmc_info["movie"]["session"]["priority"]}}.to_json

uri = URI.parse("http://api.dmc.nico:2805/api/sessions?_format=json")
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.request_uri , {
"Connection" => "keep-alive",
"Pragma" => "no-cache",
"Cache-Control" => "no-cache",
"Accept" => "application/json",
"Origin" => "http://www.nicovideo.jp",
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"content-type" => "application/json",
"DNT" => "1",
"Referer" => nico_url,
"Accept-Encoding" => "deflate",
"Accept-Language" => "ja,en-US;q=0.8,en;q=0.6",
})
req.body = req_body

res = http.request(req)
res_json = JSON.parse(res.body)
video_url = CGI.escape(res_json["data"]["session"]["content_uri"]+"&starti=0&start=0")
flv_param = flv_param.sub(/url=http.+?&/, "url=" + video_url + "&")
watch_id = json["client"]["watchId"]
thread_id = watch_id =~ /^[0-9]$/ ? watch_id : json["comment"]["threads"].find{|x| x["isDefaultPostTarget"]}.to_h["id"]
needs_key = json["comment"]["threads"].find{|x| x["id"] == thread_id && x["isThreadkeyRequired"]}
ms = json["comment"]["server"]["url"].sub(/^https/,"http")
flv_form = {
"thread_id" => thread_id,
"l" => json["video"]["duration"],
"url" => res_json["data"]["session"]["content_uri"]+"&starti=0&start=0",
"ms" => ms,
"ms_sub" => ms,
"user_id" => json["viewer"].to_h["id"],
"is_premium" => json["viewer"].to_h["isPremium"] ? 1 : 0,
"nickname" => json["viewer"].to_h["nickname"],
"time" => Time.now.strftime("%s%L"),
"done" => true,
"needs_key" => needs_key ? 1 : "",
"optional_thread_id" => needs_key ? json["comment"]["threads"].find{|x| x["id"] != thread_id && x["label"] == "default"}.to_h["id"] : "",
"ng_rv" => json["comment"]["ng"]["viewer"].to_h["revision"],
"ng_ch" => URI.encode_www_form(json["comment"]["ng"]["channel"]&.map {|x| [x["source"], x["description"]]}),
"ng_up" => URI.encode_www_form(json["comment"]["ng"]["owner"]&.map {|x| [x["source"], x["description"]]}),
"userkey" => json["comment"]["keys"]["userKey"]
}.delete_if {|k,v| v == "" || v.nil?}
puts URI.encode_www_form(flv_form)
puts video_id
puts URI.encode_www_form_component((json["video"]["title"] + "(" + json["video"]["id"] + ")"))
p res.body

rescue => e
File.open("./error.txt", "a") do |f|
f.puts(e.message)
f.puts(e.backtrace_locations)
end
end
exit(result)
--------------------------------------------------

session.rb#

--------------------------------------------------
require 'rubygems'
require 'net/http'
require 'json'
require 'kconv'
require 'Win32API'

result = 0
doLoop = true
begin
exit(0) if ARGV.length < 3

video_id = ARGV[0]
title = URI.decode_www_form_component(ARGV[1]).gsub("&", "&&").encode("UTF-16LE", "UTF-8")
json = JSON.parse(ARGV[2])
referer = "http://www.nicovideo.jp/watch/#{video_id}"
session = json["data"]["session"]["id"]
req_body = json["data"]
sleep 15

FindWindow = Win32API.new("user32", "FindWindowW",["P","P"],"L")
SendMessage = Win32API.new('user32', 'SendMessage', ["L","L","L","L"],"L")

hWnd = FindWindow.call(nil, title)
doLoop = (hWnd != 0)

while (doLoop) do

uri = URI.parse("http://api.dmc.nico:2805/api/sessions/#{session}?_format=json&_method=PUT")
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.request_uri , {
"Connection" => "keep-alive",
"Pragma" => "no-cache",
"Cache-Control" => "no-cache",
"Accept" => "application/json",
"Origin" => "http://www.nicovideo.jp",
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"content-type" => "application/json",
"DNT" => "1",
"Referer" => referer,
"Accept-Encoding" => "deflate",
"Accept-Language" => "ja,en-US;q=0.8,en;q=0.6",
})
req.body = req_body.to_json

res = http.request(req)
res_json = JSON.parse(res.body)
session = res_json["data"]["session"]["id"]
req_body = res_json["data"]

cnt = 0
while (cnt<10 && doLoop) do
hWnd = FindWindow.call(nil, title)
doLoop = (hWnd != 0)
sleep 4
cnt += 1
end
end

rescue => e
File.open("./error.txt", "a") do |f|
f.puts(e.message)
f.puts(e.backtrace_locations)
end
result = 1
end
exit(result)
--------------------------------------------------
お知らせ
実務でも趣味でも役に立つ多機能Webツールサイト【無限ツールズ】で、日常をちょっと便利にしちゃいましょう!
無限ツールズ

 
writening