【转载】自建基于Zennoposter的指纹浏览器
如果你买过Zennoposter,不想再给别的指纹浏览器掏钱;
或者你需要手动操作ZP注册出来的账号,不想来回导数据,
这篇教程正适合你!
Zennoposter本身的浏览器是可以自定义指纹信息的,详见:https://usd.fan/182.html
但是自带的浏览器正常情况只能在project maker里使用,对于操作多账号来说实在不方便。
不过ZP用C#是可以轻松做出管理功能的:

虽然没有adspower/multilogin那样点一下就能用,但是也没多几步。
并且,Zennoposter可以把整个浏览器环境保存下来,使用原环境登录大大降低了账号被风控的概率。

对于一些有养号需求的来说,再也不用手动往其他指纹浏览器里导数据了。
教程
环境制作
1. 根据实际需求,制作ZP环境,请参考:https://usd.fan/182.html
2. Porject Maker里,数据->个人配置设置

保存个人设置,下面全打勾,运行一次保存个人设置为文件。

如果是给客户用的话,代理IP和变量可以不打勾,因为代理容易失效,变量在蓝色的zennoposter里无法操作。我这里打勾是因为我可能还会在PM里进行编辑。
至此,我们有了浏览器原始环境。使用这个环境做项目,完成后再保存一次配置文件,确保存下来的cookies最新。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading;using System.IO;using System.Text.RegularExpressions;using ZennoLab.CommandCenter;using ZennoLab.InterfacesLibrary;using ZennoLab.InterfacesLibrary.ProjectModel;using ZennoLab.InterfacesLibrary.ProjectModel.Collections;using ZennoLab.InterfacesLibrary.ProjectModel.Enums;using ZennoLab.Macros;using Global.ZennoExtensions;using ZennoLab.Emulation; using System.Threading.Tasks;using System.Net;using System.Net.Mail; namespace ZennoLab.OwnCode{ public class ZennoBrowser { /// <summary> /// Global variable to store the proxy /// </summary> public static string publicProxy = ""; /// <summary> /// Global variable to store the first and last name of the loaded profile /// </summary> public static string publicPatchProfil = ""; /// <summary> /// First window for selecting a profile file /// </summary> /// <param name="project">input project (this project)</param> /// <param name="instance">input instance (this instance)</param> public static void FormLoadPatchProfil(IZennoPosterProjectModel project, Instance instance) { System.Windows.Forms.Form formLoadProfile = new System.Windows.Forms.Form(); formLoadProfile.Text = "选择账号"; formLoadProfile.Width = 725; // Set the form width in pixels formLoadProfile.Height = 300; // Set the form height in pixels formLoadProfile.Font = new Font("Microsoft YaHei", 9, FontStyle.Regular); formLoadProfile.BackColor = System.Drawing.Color.White; // Label for inserting the proxy System.Windows.Forms.Label labelInsertProxy = new System.Windows.Forms.Label(); labelInsertProxy.Text = "代理 (socks5://Login:Password@IP:PORT) - 账号将使用此代理"; labelInsertProxy.Location = new System.Drawing.Point(20, 10); labelInsertProxy.Width = 600; formLoadProfile.Controls.Add(labelInsertProxy); // Label for uploading the profile file System.Windows.Forms.Label labelUploadFile = new System.Windows.Forms.Label(); labelUploadFile.Text = "选择配置文件 (.zpprofile文件)"; labelUploadFile.Location = new System.Drawing.Point(20, 10); labelUploadFile.Width = 600; formLoadProfile.Controls.Add(labelUploadFile); // TextBox for entering the proxy System.Windows.Forms.TextBox textbProxy = new System.Windows.Forms.TextBox(); textbProxy.Location = new System.Drawing.Point(15, 50); textbProxy.Width = 650; formLoadProfile.Controls.Add(textbProxy); // TextBox for entering the profile to load System.Windows.Forms.TextBox textbPatch = new System.Windows.Forms.TextBox(); textbPatch.Location = new System.Drawing.Point(230, 100); textbPatch.Width = 400; formLoadProfile.Controls.Add(textbPatch); // Button to select a profile for loading System.Windows.Forms.Button buttonSelectProfile = new System.Windows.Forms.Button(); buttonSelectProfile.Text = "选择配置文件"; buttonSelectProfile.Location = new System.Drawing.Point(15, 100); buttonSelectProfile.Size = new System.Drawing.Size(200, 40); System.Windows.Forms.OpenFileDialog of = new System.Windows.Forms.OpenFileDialog(); formLoadProfile.Controls.Add(buttonSelectProfile); buttonSelectProfile.Click += delegate (object sender, System.EventArgs e) { if (of.ShowDialog() == System.Windows.Forms.DialogResult.OK) { formLoadProfile.Show(); ZennoBrowser.publicPatchProfil = of.FileName; ZennoBrowser.publicProxy = textbProxy.Text; textbPatch.Text = ZennoBrowser.publicPatchProfil; project.SendInfoToLog("正在加载配置: " + ZennoBrowser.publicPatchProfil, true); } }; // Button to download the account System.Windows.Forms.Button buttonDownloadAccount = new System.Windows.Forms.Button(); buttonDownloadAccount.Text = "打开浏览器"; buttonDownloadAccount.Location = new System.Drawing.Point(300, 170); buttonDownloadAccount.Size = new System.Drawing.Size(125, 65); formLoadProfile.Controls.Add(buttonDownloadAccount); buttonDownloadAccount.Click += delegate (object sender, System.EventArgs e) { if (ZennoBrowser.publicPatchProfil != "") formLoadProfile.Dispose(); }; formLoadProfile.ShowDialog(); } /// <summary> /// Main window for working with the profile file /// </summary> /// <param name="project">input project (this project)</param> /// <param name="instance">input instance (this instance)</param> public static void FormWorkProfil (IZennoPosterProjectModel project, Instance instance) { System.Windows.Forms.Form formWorkBrowser = new System.Windows.Forms.Form(); formWorkBrowser.Font = new Font("Microsoft YaHei", 9, FontStyle.Regular); formWorkBrowser.BackColor = System.Drawing.Color.White; formWorkBrowser.Text = "指纹浏览器"; formWorkBrowser.Width = 635; formWorkBrowser.Height = 620; // Label for indicating to save after work System.Windows.Forms.Label labelSave = new System.Windows.Forms.Label(); labelSave.Text = "关闭前请点击保存按钮"; labelSave.Location = new System.Drawing.Point(180, 10); labelSave.Width = 389; formWorkBrowser.Controls.Add(labelSave); // Label for selecting a file to upload and then clicking UPLOAD on the site System.Windows.Forms.Label labelFileDownload = new System.Windows.Forms.Label(); labelFileDownload.Text = "选择上传文件"; labelFileDownload.Location = new System.Drawing.Point(35, 105); labelFileDownload.Width = 589; formWorkBrowser.Controls.Add(labelFileDownload); // Label for entering a URL and clicking GO - the site will load in a new tab System.Windows.Forms.Label labelUrlDownload = new System.Windows.Forms.Label(); labelUrlDownload.Text = "输入网址,将会在新标签页打开"; labelUrlDownload.Location = new System.Drawing.Point(35, 200); labelUrlDownload.Width = 600; formWorkBrowser.Controls.Add(labelUrlDownload); // Label for displaying the loaded account System.Windows.Forms.Label labelDownloadAccount = new System.Windows.Forms.Label(); labelDownloadAccount.Text = "当前配置文件: " + publicPatchProfil; labelDownloadAccount.Location = new System.Drawing.Point(35, 290); labelDownloadAccount.Width = 490; labelDownloadAccount.Height = 30; formWorkBrowser.Controls.Add(labelDownloadAccount); // Label for notes System.Windows.Forms.Label labelNote = new System.Windows.Forms.Label(); labelNote.Text = "备注"; labelNote.Location = new System.Drawing.Point(35, 335); labelNote.Width = 590; formWorkBrowser.Controls.Add(labelNote); // TextBox for entering a URL to navigate System.Windows.Forms.TextBox textbGoUrl = new System.Windows.Forms.TextBox(); textbGoUrl.Location = new System.Drawing.Point(35, 240); textbGoUrl.Width = 450; formWorkBrowser.Controls.Add(textbGoUrl); // RichTextBox for notes System.Windows.Forms.RichTextBox rtboxNotes = new System.Windows.Forms.RichTextBox(); rtboxNotes.Location = new System.Drawing.Point(35, 360); rtboxNotes.Width = 550; rtboxNotes.Height = 200; rtboxNotes.Text = project.Profile.SecretQuestionAnswer2; formWorkBrowser.Controls.Add(rtboxNotes); // Button to open Google search page System.Windows.Forms.Button buttonOpenGoogle = new System.Windows.Forms.Button(); buttonOpenGoogle.Text = "?谷歌"; buttonOpenGoogle.Location = new System.Drawing.Point(5, 41); buttonOpenGoogle.Size = new System.Drawing.Size(105, 45); formWorkBrowser.Controls.Add(buttonOpenGoogle); buttonOpenGoogle.Click += delegate (object sender, System.EventArgs e) { instance.NewTab("whoer"); instance.ActiveTab.Navigate("https://www.whoer.net/"); }; // Button to go back System.Windows.Forms.Button buttonGoBack = new System.Windows.Forms.Button(); buttonGoBack.Text = "◀后退"; buttonGoBack.Location = new System.Drawing.Point(130, 41); buttonGoBack.Size = new System.Drawing.Size(105, 45); formWorkBrowser.Controls.Add(buttonGoBack); buttonGoBack.Click += delegate (object sender, System.EventArgs e) { instance.ActiveTab.GoBack(); }; // Button to reload the page System.Windows.Forms.Button buttonReloadPage = new System.Windows.Forms.Button(); buttonReloadPage.Text = "?刷新"; buttonReloadPage.Location = new System.Drawing.Point(255, 41); buttonReloadPage.Size = new System.Drawing.Size(105, 45); formWorkBrowser.Controls.Add(buttonReloadPage); buttonReloadPage.Click += delegate (object sender, System.EventArgs e) { instance.ActiveTab.MainDocument.EvaluateScript("window.location.reload(true)"); }; // Button to close the tab System.Windows.Forms.Button buttonClosePage = new System.Windows.Forms.Button(); buttonClosePage.Text = "❎关闭"; buttonClosePage.Location = new System.Drawing.Point(380, 41); buttonClosePage.Size = new System.Drawing.Size(105, 45); formWorkBrowser.Controls.Add(buttonClosePage); buttonClosePage.Click += delegate (object sender, System.EventArgs e) { instance.ActiveTab.Close(); }; // Button to save the account and exit System.Windows.Forms.Button buttonSaveAccount = new System.Windows.Forms.Button(); buttonSaveAccount.Text = "?保存并退出"; buttonSaveAccount.Location = new System.Drawing.Point(505, 41); buttonSaveAccount.Size = new System.Drawing.Size(105, 45); buttonSaveAccount.BackColor = System.Drawing.Color.Aquamarine; formWorkBrowser.Controls.Add(buttonSaveAccount); buttonSaveAccount.Click += delegate (object sender, System.EventArgs e) { project.Profile.SecretQuestionAnswer2 = rtboxNotes.Text; formWorkBrowser.Dispose(); }; // Button to choose a file System.Windows.Forms.Button buttonChooseFile = new System.Windows.Forms.Button(); buttonChooseFile.Text = "选择要上传的文件"; buttonChooseFile.Location = new System.Drawing.Point(170, 135); buttonChooseFile.Size = new System.Drawing.Size(200, 52); System.Windows.Forms.OpenFileDialog of = new System.Windows.Forms.OpenFileDialog(); formWorkBrowser.Controls.Add(buttonChooseFile); buttonChooseFile.Click += delegate (object sender, System.EventArgs e) { if (of.ShowDialog() == System.Windows.Forms.DialogResult.OK) { formWorkBrowser.Show(); instance.SetFilesForUpload(of.FileName); project.SendInfoToLog("文件已上传: " + of.FileName, true); } }; // Button to navigate to the entered URL System.Windows.Forms.Button buttonGoToUrl = new System.Windows.Forms.Button(); buttonGoToUrl.Text = "打开网址"; buttonGoToUrl.Location = new System.Drawing.Point(505, 220); buttonGoToUrl.Size = new System.Drawing.Size(105, 55); formWorkBrowser.Controls.Add(buttonGoToUrl); buttonGoToUrl.Click += delegate (object sender, System.EventArgs e) { if (textbGoUrl.Text != "") { instance.NewTab(textbGoUrl.Text); instance.ActiveTab.Navigate(textbGoUrl.Text); } }; formWorkBrowser.ShowDialog(); } /// <summary> /// Clears cache, cookies, sets proxy, closes the window, changes browser window size, and loads a profile if available /// </summary> /// <param name="project">input project (this project)</param> /// <param name="instance">input instance (this instance)</param> /// <param name="profilePath">path to the saved profile</param> public static void SetProfil(IZennoPosterProjectModel project, Instance instance, string profilePath = "") { if (!profilePath.Contains(".zpprofile")) ZennoBrowser.ErrorExit(project, instance, "配置文件不是.zpprofile格式: " + profilePath); instance.ClearCache(); instance.ClearCookie(); project.Profile.CookieContainer.Clear(); if (profilePath != "" || !File.Exists(profilePath)) { project.Profile.Load(profilePath, true); project.SendInfoToLog("配置文件已加载", true); } else ZennoBrowser.ErrorExit(project, instance, "读取配置中...配置文件未找到: " + profilePath); if (publicProxy == "") instance.ClearProxy(); else instance.SetProxy(publicProxy, false, true, true, true); instance.SetWindowSize(project.Profile.AvailScreenWidth, project.Profile.AvailScreenHeight); } /// <summary> /// Exit on error and log the error message /// </summary> /// <param name="project">input project (this project)</param> /// <param name="instance">input instance (this instance)</param> /// <param name="logMessage">Message to log</param> public static void ErrorExit(IZennoPosterProjectModel project, Instance instance, string logMessage = "") { project.SendErrorToLog(logMessage, true); throw new Exception(); } }} |
2. 然后添加一个C#

输入代码
ZennoPoster.ShowInstance("127.0.0.1", instance.Port, "server");ZennoBrowser.FormLoadPatchProfil(project, instance);ZennoBrowser.SetProfil(project, instance, ZennoBrowser.publicPatchProfil); project.SendInfoToLog(" ==== 正在使用配置文件 " + ZennoBrowser.publicPatchProfil + " =========", true); instance.ActiveTab.Navigate(@"https://www.facebook.com/");instance.ActiveTab.WaitDownloading();ZennoBrowser.FormWorkProfil(project, instance);project.SendInfoToLog(" ==== 配置文件已保存 "+ ZennoBrowser.publicPatchProfil +" =========", true); project.Profile.Save(ZennoBrowser.publicPatchProfil, true, true, true, true, true, true, true, true, true); |
运行这个C#,就能看到结果。

