如何从Youtube下载视频广告?

时间:2014-01-01 22:41:28

标签: video youtube ads

我想从YouTube上下载一些(我的意思是很多)视频广告(不是视频,而是在他们之前播放的广告)用于研究目的。

有关工具或方法的任何建议可以实现吗?我不会介意我的黑客编程,但我目前不知道怎么做。此外,YouTube不是必需的;来自其他视频网站的视频广告也适合我。

4 个答案:

答案 0 :(得分:10)

  

当我发现你的问题时,我觉得玩它会很有趣,   正如我最近开发的网站(http://savedeo.com)允许您这样做   从包括YouTube在内的多个网站下载视频。

我只关注Youtube的广告系统,这对其他系统(最有可能)不起作用。关于YouTube的好处是,您可以直接从视频页面获取所有必要的信息,因此可以更快地抓取它(我在一个非常小的服务器上一天下载了近22M的视频页面)。所以你要找的部分是;ytplayer.config = {(.*?)};,它包含内联json对象(易于处理)。你不需要任何其他东西。

如果您不想从HTML中解析它,可以通过在任何Youtube视频链接的末尾添加参数&spf=prefetch来直接获取json对象,例如https://www.youtube.com/watch?v=bbEoRnaOIbs&spf=prefetch

并非每个YouTube视频都在展示广告(根据我的统计信息,只有18%的视频会显示广告)。您只需在json对象中查找ad_tag密钥,即可验证是否为视频启用了广告。

YouTube正在使用三种不同的广告系统:

  • 的AdSense
  • 的AdSense / ADX
  • 第三方系统

从两个不同的来源投放广告: - 用作广告的YouTube上传的视频(大部分仅显示视频的一部分) - 来自外部来源的视频(第三方广告服务器)

所有这些的出发点都是一样的。在json对象中找到dynamic_allocation_ad_tag键。它包含一个通向双击服务器的URL。只有在您使用实际AR值更改此部分sz=WIDTHxHEIGHT;之后,此网址才会生效,例如sz=480x70,480x360,480x361;

您希望在同一个json文件中找到另外三个键tpas_partner_idtpas_video_idvideo_id(来自网址的video_id),因为这些键将用于第三方广告系统。

现在,您可以点击双击网址,该网址会返回一个XML文件,其中包含有关此视频的广告信息。整个文件很有趣并且充满了重要信息(所以你应该将它与视频一起存储)。查找这三个键AdSystemAdTitleDescription

  • AdSystem :告诉您用于投放广告的系统。有三种选择(正如我之前提到的)
    • 的AdSense
    • 的AdSense / ADX
    • GDFP
  • AdTitle :告诉您广告的类型(例如视频或横幅广告)
  • 说明:告诉您与AdTitle大致相同,但有时会包含广告说明

如果广告是通过adsense系统(adsense或adx)提供的,则此xml包含广告的所有信息,包括广告的持续时间和直接链接。该链接正是您要查找的内容,您可以在密钥MediaFile下找到它。

链接大多看起来像http://www.youtube.com/get_video?video_id=LCeDi-d5CRg&ts=1391921207&t=CyJEI0XYwJVJEYE5CVhqY-DF3KQ&gad=1,它会将您重定向到mp4格式的真实文件。如果广告系统是ADX,您将获得主要是flv文件的直接链接,例如http://playtime.tubemogul.com/ad_promoted_videos/4799351_dhxsYlMYHmLMmxL0oBem_1390593897.flv

如果广告是来自第三方系统的服务器 GDFP ,则必须呼叫不同的服务器。对于第三方广告,Youtube使用FreeWheel服务。要获取广告数据,您必须准备一个XML请求,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <adRequest profile="{profile}" networkId="10613" version="1">
       <capabilities>
          <expectMultipleCreativeRenditions />
          <supportsAdUnitInMultipleSlots />
          <supportsSlotCallback />
          <supportNullCreative />
          <supportAdBundle />
          <supportsFallbackAds />
          <autoEventTracking />
          <requiresRendererManifest />
          <requiresVideoCallbackUrl />
       </capabilities>
       <visitor caller="AS3-5.6.0-r9954-1305270957">
          <httpHeaders>
             <httpHeader value="https://www.youtube.com/watch?v={video_id}" name="referer" />
             <httpHeader value="12,0,0,38" name="x-flash-version" />
          </httpHeaders>
       </visitor>
       <keyValues>
          <keyValue key="_fw_distributorvideoassetid" value="{video_id}" />
          <keyValue key="_fw_yt_type" value="short" />
          <keyValue key="_fwu:10613:lang" value="eng" />
       </keyValues>
       <siteSection pageViewRandom="{random}" customId="youtube_watch" siteSectionNetworkId="{tpas_partner_id}">
          <videoPlayer>
             <videoAsset autoPlay="true" duration="318" videoPlayRandom="{random}" customId="{tpas_video_id}" videoAssetNetworkId="{tpas_partner_id}">
                <adSlots height="390" defaultSlotProfile="{profile}" width="699" compatibleDimensions="2560,1440">
                   <temporalAdSlot height="390" adUnit="preroll" timePosition="0" customId="0_1" width="699" />
                   <temporalAdSlot height="390" adUnit="overlay" timePosition="0" customId="0_2" width="699" />
                </adSlots>
             </videoAsset>
             <adSlots>
                <nonTemporalAdSlot height="60" customId="0_5" width="300" acceptCompanion="true" />
                <nonTemporalAdSlot height="250" customId="0_6" width="300" acceptCompanion="true" />
             </adSlots>
          </videoPlayer>
          <adSlots />
       </siteSection>
    </adRequest>

您可能在{}中发现了多个变量。您必须使用自定义数据替换它们,主要是使用从json对象获取的数据。

  • tpas_partner_id :从json对象获取
  • tpas_video_id :从json对象获取
  • 随机:自纪元以来的时间,以微秒为单位
  • video_id :从json对象(或从youtube网址获取)获取
  • 个人资料:我找到了两个不同的个人资料。有时一个工作,另一个不工作,反之亦然。每次10613:10613_youtube_as3_player10613:youtube2都会尝试。

现在,您将此XML文件作为POST请求发送到https://2975c.v.fwmrm.net/ad/p/1? (不要忘记使用内容类型application/xml发送)。

响应包含另一个XML文件,您可以在其中获得广告所需的所有数据,包括各种格式和尺寸的直接链接。您可以在密钥asset下找到它们。同样,您应该将整个文件与视频一起存储,因为它包含广告的其他数据。

就是这样,快乐的狩猎。

答案 1 :(得分:7)

更简单的解决方案是右键单击视频窗口并选择Stats for nerds

enter image description here

将显示统计信息列表,查找Video ID并复制它 - 仅复制/字符前的字符串部分,因为您只需要Video ID,而不是sCPN Stats for nerds字符串。 (例如,我正在寻找Sam Ovens视频,但广告视频没有可点击链接,因此我使用了a-C4m7teAAU功能并找到了ID:YouTube)。

enter image description here

然后只需将视频ID添加到标准public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set title for the GridView setTitle("GridView"); // Get the view from grid_view.xml setContentView(R.layout.grid_view); // Set the images from ImageAdapter.java to GridView GridView gridview = (GridView) findViewById(R.id.gridview); //gridview.setAdapter(new ImageAdapter(this)); //commented line 05052018 gridview.setAdapter(new ChangesofAdapter(this)); //new line 05052018 // Listening to GridView item click gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // Launch ImageViewPager.java on selecting GridView Item Intent i = new Intent(getApplicationContext(), ImageViewPager.class); // Show a simple toast message for the item position Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show(); // Send the click position to ImageViewPager.java using intent i.putExtra("id", position); // Start ImageViewPager startActivity(i); } }); } } 观看网址中,如下所示:

  

https://www.youtube.com/watch?v=a-C4m7teAAU

答案 2 :(得分:3)

2020年5月,这些方法对我有用

3秒模式

  • 在播放视频广告时右键单击。
  • 选择[书呆子统计]。
  • 打开您的开发者浏览器控制台并将其粘贴。如果您担心此javascript,请检查说明部分
alert("https://www.youtube.com/watch?v="+$(".html5-video-info-panel-content").children[0].children[1].textContent.replace(" ","").split("/")[0])
  • 系统将提示您准备复制和粘贴的网址

url


手动模式

  • 在播放视频广告时右键单击。
  • 选择[复制调试信息]。
  • 然后在Windows中打开任何文本编辑程序(如记事本)并将其粘贴到其中。
  • 在粘贴的文本中搜索以下内容: “ ad_debug_videoId”:“ XXXXXXXXX”
  • 视频网址为:
https://www.youtube.com/watch?v=XXXXXXXXX

说明

在撰写本文时,[书呆子统计]的html是:

<div class="html5-video-info-panel" data-layer="4">
   <button class="html5-video-info-panel-close ytp-button" title="close">[x]</button>
   <div class="html5-video-info-panel-content">
      <div>
         <div>Video ID / sCPN</div>
         <span>I4VzIvGdTxI / GD6Y 2G9R N3W5</span>
      </div>
      <div>
         <div>Viewport / Frames</div>
         <span>640x360 / 0 dropped of 1706</span>
      </div>   
      <!-- a lot of divs    -->
   </div>
</div>

如您所见,我们的ID位于 span 内,它是div类别为的div的 first second 子html5-video-info-panel-content

jQuery帮助我们获取span值:

$(".html5-video-info-panel-content").children[0].children[1]

然后,我们需要删除空格并拆分以获取视频ID:

.textContent.replace(" ","").split("/")[0]

最后,我们将此值连接到

"https://www.youtube.com/watch?v="

参考

答案 3 :(得分:0)

好。所以,我也一直在尝试这样做...

在我大部分时间放弃之后,我右键点击了广告-它提供了复制“视频ID”的功能。出于某种原因-我只是将剪贴板内容粘贴到网址栏中-并到达了广告的youtube视频。可能是偶然,但那一次还是有效的。从那里-我使用了其中一种“从youtube下载”类型的网站(显然是试图让您安装软件-请注意)-https://www.y2mate.com/等----然后我得到了视频。 / p>

(此后我一直无法执行此操作...)-也许它会为其他人提供一些联系-您可以解释为什么会发生这种情况。

更新:似乎有时它可以工作...也许设置了某些广告以供查找。这里有一些证明:https://vimeo.com/372764735