如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。
因为自己买的一批号,没有时间去管理,一半的号粉丝量也没够1000(因为以为粉丝量不够但是号已经有盈利功能了就无所谓了),这次被波及了。一批取消了盈利,目前也没空继续扩大,手上仅存一批账号还在跑,因此考虑到未来我这边要扩大,肯定要继续改动代码,因此,放出目前的代码,对我没啥影响。
喷子太多,早期我在知乎上简单的回复,就引了一批傻X的喷,一些是版权喷子,一些是道德喷子,还有一些就是直接否定操作性,吧啦吧啦一堆。
当然,做为怼天怼地怼空气的老农来说,不差因为今天再多了几个喷子。
爱做不做,爱干不干,没能力的人从来自会为自己不能做找借口,他们的观点就是自己做不了的事情,赚不到钱的事情,全天下人都不能做。MMP。你个糟X碧池。
直接搬运=侵权
间接搬运修改MD5等,背景音乐侵权
因此,我的思路比较简单,在自媒体百家齐放的这几年,最不愁的就是自媒体文章,一堆自媒体人每天不停的瞎编文章,公众号也是一堆人不停的写文章吸粉,那么这些就是源头。
操作上,采集文章,标题+内容
内容有够多的文字就行了。图片太少或者文章没图片怎么办?
这个好解决,直接跟进标题,去google或者百度搜索即可 得到的图片下载一些下来即可。
声音怎么处理?
腾讯AI 百度AI有这样的 文章转语音接口。
目前价格已经炒的很贵,这里就不介绍,老样子,能做的人总能自己找到资源,
不能做的人,总是为自己的能力找借口,或者自己压根喜欢伸手党,不去自己找这块资源。
量化是操作的核心。
一个号跑赚那么点钱,一批号跑就赚的很多了。
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");