【问题标题】:Submiting an ajax form with php用php提交ajax表单
【发布时间】:2011-10-03 03:24:02
【问题描述】:

我正在构建一个 php 程序来从网站获取 3 个变量并计算它们然后发布结果,我可以读取变量,计算它们,但发布部分对我来说很难,因为它使用 Ajax 表单(我认为) 是否可以使用 XMLhttprequest 使用 php 发布?

这是提交按钮:

<a href="#" class="formSubmit" tabindex="3">

这是消息框:

<textarea name="message" id="messageContent" rows="18" wrap="virtual" tabindex="2"></textarea>

我试过像普通表单一样处理它,但它不起作用,我追踪了 ajax 函数来发布:

function formSubmitFunction(e,action, target){
    e.stopPropagation();
    e.preventDefault();
    if ($("#messageContent").attr("value") == undefined || $("#messageContent").attr("value").length < 2){
        alert("A mensagem precisa ter no mínimo 2 caracteres.");
        $("#messageContent").focus();
        return false;
    }else {
        $("#formSubmit").html('<img src="http://website.com/'+desTheme+'/images/send_post.gif');
        if(action == "post"){
            $("#formAjax").append('<div id="carregando"></div>');
            PostFunctions.insertPost(topicId,$("#messageContent").val(), callbackInsertPost);
        } else {
            var postId = target.replace("#","");
            $("#formAjax").append('<div id="carregando"></div>');           
            PostFunctions.editPost(postId,$("#messageContent").val(), callbackEditPost);
        }
        return false;
    }
}

帮助

@编辑:

找到另一个 insertPost 函数

function callbackInsertPost(response){
        var result = eval("("+response+")");
        if($("#popup").length){
            $("#popup").remove();
        }
        if(!result.error){
            var returnMessage = "";
            if(result.isForumModerated){
                returnMessage = '<div id="popup" class="autoClear simple">'
                                    +'Sua mensagem está aguardando a aprovação da moderação.'
                                    +'</div>';
                $("#carregando").remove();
                $(actualPostId).prepend(returnMessage);
                window.setTimeout(function(){
                    $("#popup").fadeOut("slow", function(){
                        $("#popup").remove();
                    });
                },5000);
            $("#formAjax").remove();
            } else {
                //console.log(result);
                window.setTimeout(function(){
                    document.location = "_t_lastpost_"+topicId+"_"+forumId+"?postId="+result.postId;
                },1500);
                /*returnMessage = '<div id="popup" class="autoClear simple">'
                                    +'Mensagem enviada com sucesso! Clique neste <a href="_t_lastpost_'+topicId+'_'+forumId+'">link</a> para ver sua mensagem'
                                    +'</div>';*/
            }
        } else {
            if(result.nickname_reproved){
                document.location = "changenickname.jbb";
            } else {
                $("#carregando").remove();
                for(i = 0; i < result.messages.length; i++){
                    $("#formAjax").prepend('<div id="popup" class="autoClear error-post">'
                                        +result.messages[i]+'<br/>'
                                        +'</div>'); 
                    }
                $.scrollTo("#popup",500);
                $("#formSubmit").html('<a href="#" class="formSubmit" tabindex="3"><img src="'+baseImages+'/themes/'+desTheme+'/images/pm_send.gif"/></a>');
                $(".formSubmit").bind("click",function(e){
                    formSubmitFunction(e,"post")
                });
            }
        }
}

@edit2:

PostFunctions.insertPost = function(p0, p1, callback) {
    DWREngine._execute(PostFunctions._path, 'PostFunctions', 'insertPost', p0, p1, callback);
}

【问题讨论】:

  • 看起来您正在使用 jquery,但实际的 post 函数位于 PostFunctions 对象中。您需要显示该部分的代码并解释问题到底是什么。
  • 找到它,在主帖上编辑,问题是:我不能使用 curl 发布新消息,因为提交按钮使用的是 ajax,我可以使用 PHP 吗?
  • @André Cardoso,您绝对可以使用 cURL 发帖。 AJAX 没什么特别的......它只是普通的 HTTP 和其他任何东西一样。
  • 不是,你刚刚添加了发帖成功后调用的回调函数。
  • 这是我可以在源代码上跟踪的最后一个函数,添加到 @edit2

标签: php ajax forms html-parsing


【解决方案1】:

忘记你正在查看的所有 JavaScript 内容。在模拟浏览器时,您只需重新创建发送到服务器的请求。

  1. 打开提琴手或萤火虫的网络面板。
  2. 在浏览器中发帖。
  3. 在 fiddler/firebug 中查找 ajax 帖子。
  4. 使用 PHP curl 使用您看到的相同参数创建常规帖子 在提琴手中。

确保检查标头以防 javascript 设置一些 cookie。

编辑

  • cookie 文件由 curl 创建,格式与 fiddler 不同。删除它并让 curl 创建它。

  • c0-id 是隐藏的表单域吗?查看源代码。如果您在另一个浏览器中查看它时它发生了变化,您需要抓取表单,然后根据该值执行您编写的帖子。

    • 发布到显示表单的页面。使用CURL_OPT_COOKIEJAR

    • CURL_OPT_COOKIEJAR 如果您发布到两个不同的页面,它很有用,因为它会记住上次请求中设置的 cookie,就像浏览器一样。

  • 确保您的用户代理是真正的浏览器。

  • 观察浏览器和您的脚本通过 fiddler 访问服务器。您希望脚本的行为与浏览器完全相同。因此,请继续调整您的脚本以使其更接近。最终它会起作用。

  • 抓取网站起初可能非常令人沮丧且耗时。坚持下去。

    • 将代码组织成函数和类。这样发多个帖子会更容易。

【讨论】:

  • 找到这个:callCount=1 c0-scriptName=PostFunctions c0-methodName=insertPost c0-id=6001_1310347486332 c0-param0=number:1576140 c0-param1=string:fiddler%20hehe%20haha%20searchme xml =true 我会尝试的,但是 javascript 确实设置了一些 cookie,我应该如何处理它们?
  • 您必须自己设置它们。看看 curls cookie 处理。并查看我在这里发的这篇文章stackoverflow.com/questions/3622596/…
  • 谢谢,但有一个问题:我发了两次,cookie 设置不一样,我该怎么办?找到它们是如何在源代码中生成的?我能找到吗?
  • 在执行表单的 GET 时(在发布之前)查​​看是否找到 Set-Cookie: 标头。服务器可能正在设置 cookie。否则,您需要获取 jquery cookie 设置或纯 javascript (document.cookie) 代码的源代码。然后弄清楚它在做什么并在php中重现。
  • 哎呀,显然我用另一个帐户发送下一个答案,因为我在另一台计算机上,你能看吗?非常感谢拜伦
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
相关资源
最近更新 更多