专栏名称: 黑帽互联
黑帽技能传播者。分享有趣的Hack技能
目录
相关文章推荐
新加坡眼  ·  围棋泰斗齐聚新加坡,棋圣会议尘封往事 ·  16 小时前  
新加坡眼  ·  PR可以在新加坡买组屋吗? ·  16 小时前  
新加坡眼  ·  想体验正宗的泼水节?新加坡也可以! ·  16 小时前  
新加坡眼  ·  新加坡30亿洗钱案财产这样处置 ·  16 小时前  
51好读  ›  专栏  ›  黑帽互联

Youtube自动化采集赚钱操作方法公开

黑帽互联  · 公众号  ·  · 2019-03-11 12:39

正文

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

因为自己买的一批号,没有时间去管理,一半的号粉丝量也没够1000(因为以为粉丝量不够但是号已经有盈利功能了就无所谓了),这次被波及了。一批取消了盈利,目前也没空继续扩大,手上仅存一批账号还在跑,因此考虑到未来我这边要扩大,肯定要继续改动代码,因此,放出目前的代码,对我没啥影响。

喷子太多,早期我在知乎上简单的回复,就引了一批傻X的喷,一些是版权喷子,一些是道德喷子,还有一些就是直接否定操作性,吧啦吧啦一堆。


当然,做为怼天怼地怼空气的老农来说,不差因为今天再多了几个喷子。

爱做不做,爱干不干,没能力的人从来自会为自己不能做找借口,他们的观点就是自己做不了的事情,赚不到钱的事情,全天下人都不能做。MMP。你个糟X碧池。


视频制作思路
STEP1:视频源

直接搬运=侵权

间接搬运修改MD5等,背景音乐侵权


因此,我的思路比较简单,在自媒体百家齐放的这几年,最不愁的就是自媒体文章,一堆自媒体人每天不停的瞎编文章,公众号也是一堆人不停的写文章吸粉,那么这些就是源头。



操作上,采集文章,标题+内容


内容有够多的文字就行了。图片太少或者文章没图片怎么办?


这个好解决,直接跟进标题,去google或者百度搜索即可  得到的图片下载一些下来即可。


声音怎么处理?


腾讯AI 百度AI有这样的 文章转语音接口。


STEP2:有一个已经开启了盈利的账号

目前价格已经炒的很贵,这里就不介绍,老样子,能做的人总能自己找到资源,


不能做的人,总是为自己的能力找借口,或者自己压根喜欢伸手党,不去自己找这块资源。

STEP3:VPS批量跑

量化是操作的核心。


一个号跑赚那么点钱,一批号跑就赚的很多了。


VPS 这里量化推荐阿里云国际版,真的稳

采集自媒体文章入库

最近忙,就不配牛逼的表情包了


因为涉及到量化,因此,我考虑的是首先,文章源要够,每一个YOUTUBE频道传的视频内容要做到不一样,如何解决这个问题呢?


很简单


我用PHP简单的配合MYSQL做一个接口文件

-- --------------------------------------------------------


--

-- 表的结构 `ytb`

--


CREATE TABLE `ytb` (

`id` int ( 11 ) NOT NULL ,

`url` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ,

`used` int ( 11 ) NOT NULL ,

`type` text CHARACTER SET utf8 NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


--

-- 转存表中的数据 `ytb`

--



入库的PHP脚本

error_reporting(E_ALL);

ini_set("display_errors", 1);

$url=base64_decode($_GET["url"]);

$type=$_GET["source"];

$c = mysqli_connect("127.0.0.1", "affadsense.com", "affadsense.com","affadsense.com");

$insertdata="insert into ytb(url,used,type) values('$url',0,'$type');";


if($c->query($insertdata)==true){

echo "插入数据成功";

}else{

echo "Error insert data: " . $c->error;

}

mysqli_close($c);



提取URL的脚本

error_reporting(E_ALL);

ini_set("display_errors", 1);

$type=$_GET["source"];

$c = mysqli_connect("127.0.0.1", "affadsense.com", "affadsense.com","affadsense.com");

$sql="select * from ytb where type='$type' and used =0 order by id desc  limit 1";

$obj =$c->query($sql);

while($row = mysqli_fetch_assoc($obj)){

$id=$row['id'];

$url=$row['url'];

echo $url;

$sql2="update ytb set used=1 where id=$id";

if($c->query($sql2)==true)

{}

}

mysqli_close($c);




这里懂脚本的应该知道,入库的时候,我设置used=0,提取的时候used=0的URL,然后提取后就设置used=1

这样,每一个URL就不会重复被使用了。


自媒体文章转视频



从接口提取url就不说了。

URL提前文章标题,文章内容以及文章中的配图也很简单,

主要是文章怎么转视频这块


把提取的内容部分,通过百度AI文字转语音或者腾讯文字转语音,转为MP3文件。当然,调用系统的也行,不过略显生涩。


然后有了MP3文件,就知道整个视频的长度,然后根据图片的数量,把每一张图片的播放时间计算好,再进行MP3  视频的合并。

视频加工:

画中画,视频播放前的播放头视频


视频加滚动文字的代码:


总之,这里涉及到了ffmpeg这个工具,费了不少时间去研究命令,并且买了本书

然并软,书压根没咋看,还是靠google baidu  sogou soso等等等



代码过长,因此公众号完全贴不完,只能说个大概。


视频上传

上传部分,早期用的是youtube的官方api,但是发现,API上传默认是不开启盈利功能的,还是得配合浏览器插件,手动写了一下开启盈利的动作后,定期去滚动执行去获取的。


后来我直接改用selenium这个东西,

ChromeOptions options = new ChromeOptions();

options.AddArgument("--user-data-dir=" + fileDir + "/data");

ChromeDriver driver = new ChromeDriver(options);

try

{

driver.Navigate().GoToUrl("https://www.youtube.com/upload");

string htmlcode = driver.FindElement(By.TagName("body")).GetAttribute("innerHTML");

// video = fileDir + "/"+


try

{

//

driver.FindElement(By.XPath("//input[@type='file'])[2]")).SendKeys(video);

}


catch

{

try

{

driver.FindElement(By.XPath("//*[@id=\"upload-prompt-box\"]/div[2]/input")).SendKeys(video);

}

catch { }

}


text = suoxie.StringTruncat(richTextBox1.Text + text, 5007, "...");


Thread.Sleep(2000);

driver.FindElement(By.XPath("//*[@id=\"upload-item-0\"]/div[3]/div[2]/div/div/div[1]/div[3]/form/div[1]/fieldset[1]/div/label[1]/span/input")).Clear();

driver.FindElement(By.XPath("//*[@id=\"upload-item-0\"]/div[3]/div[2]/div/div/div[1]/div[3]/form/div[1]/fieldset[1]/div/label[1]/span/input")).SendKeys(title);

driver.FindElement(By.XPath("//*[@id=\"upload-item-0\"]/div[3]/div[2]/div/div/div[1]/div[3]/form/div[1]/fieldset[1]/div/label[2]/span/textarea")).SendKeys(text);

Thread.Sleep(10000);

htmlcode = driver.FindElement(By.TagName("body")).GetAttribute("innerHTML");

if (htmlcode.Contains("您的视频将出现在以下位置") || htmlcode.Contains("Your video will be live at"))

{

ress = GlobalRegex.RegexMatch(htmlcode, @"(?<=https://youtu\.be/).*?(?="")");

ress = "https://youtu.be/" + ress;

try

{

driver.FindElement(By.XPath("//*[@id=\"upload-item-0\"]/div[3]/div[2]/div/div/div[1]/div[3]/form/div[1]/fieldset[3]/div/span[3]/div[2]/div[1]/div/div/input")).SendKeys(thumbfile);//图片所旅途

}

catch(Exception EEE)

{

var log = new LogManager();

log.WriteLog(EEE.StackTrace);

}




}

for (int i = 0; i < 1200; i++)

{

Thread.Sleep(1000);

htmlcode = driver.FindElement(By.TagName("body")).GetAttribute("innerHTML");

if (driver.Title.Contains("已上传 1 个视频"))

{


try

{

driver.FindElement(By.ClassName("save-cancel-buttons")).Click();

i = 1201;

}

catch(Exception ez)

{

MessageBox.Show(ez.Message);

}

try

{


htmlcode = driver.FindElement(By.TagName("body")).GetAttribute("innerHTML");

if (htmlcode.Contains("要在视频中投放广告,您现在需要在每次上传视频时为其启用广告获利功能"))

{

try

{

driver.FindElement(By.XPath("//*[@id=\"upload-item-0\"]/div[3]/div[2]/div/div/div[1]/div[1]/ul/li[2]/div[1]/a/sub/span")).Click();

Thread.Sleep(5000);

driver.FindElement(By.XPath("//*[@id=\"monetize-with-ads\"]")).Click();

Thread.Sleep(1000);

driver.FindElement(By.CssSelector("#upload-item-0 > div.upload-item-main > div.upload-state-bar > div.metadata-actions > div > div > button")).Click();

i = 1201;


}

catch (Exception ee) {

var log = new LogManager();

log.WriteLog(ee.StackTrace);

}



}

}

catch (Exception eee) {

var log = new LogManager();

log.WriteLog(eee.StackTrace);

}

break;

}


}

try

{

DelectDir(Environment.CurrentDirectory + "\\images");

DelectDir(Environment.CurrentDirectory + "\\mv");







请到「今天看啥」查看全文